2017-01-26 6 views
-2

У меня есть кусок кода как такового (упрощенный): импорт scala.concurrent.FutureЗаполнитель для класса корпуса? Scala для понимания

case class BigCase(id: Int, v2: Int, v3: Int) 

object Repo { 
    def insert(i: BigCase):Future[Int] = ??? 

    val r = for { 
    id <- insert(BigCase(1,2,3)) 
    } yield { 
    id 
    } 

    println(s"result: $r") 
} 

Он отлично работает, но когда у меня есть огромный класс «BigCase» с 15 полями, то было бы неплохо, чтобы иметь возможность написать

вставки (_)

, вместо

вставка (BigCase (1,2,3,4,5,6 ...))

, особенно во время фазы тупиковой-аут. Но как только я сделал insert(_), id стал типом «Nothing», что делает дальнейшие шаги сложными для составления.

Есть ли способ вокруг него?

ответ

1

Я не уверен, как ваш код должен работать, но вы определяете свой экземпляр BigCase в первый раз в своем понимании. Там нет никакого способа, чтобы сократить самое декларацию, но я думаю, что ваш код имеет больше смысла, если экземпляр BigCase определен до для понимания:

scala> import scala.concurrent.Future 
import scala.concurrent.Future 

scala> import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.ExecutionContext.Implicits.global 

scala> def insert(bc: BigCase): Future[Int] = Future({Thread.sleep(1000); bc.id}) 
insert: (bc: BigCase)scala.concurrent.Future[Int] 

scala> val myBC = BigCase(1,2,3) 
myBC: BigCase = BigCase(1,2,3) 

scala> val r = for {id <- insert(myBC)} yield id 
r: scala.concurrent.Future[Int] = [email protected] 

scala> r.onComplete(println) 
Success(1) 
+0

Извините за недоразумение, вопрос на самом деле не «как сделать эту работу», скорее, я надеюсь найти способ вызова insert(), не предоставляя его полномасштабный класс BigCase во время фазы псевдокода, вроде как вставка вызова (???), но при этом компилятор возвращает правильный тип возврата. – BZapper

+1

Ну, вы не можете запустить что-либо с помощью 'insert = ???', вы просто имеете в виду местозаполнитель для вашего компилятора? 'null' может работать, иначе вы могли бы« вставить »accept' Option [BigCase] ​​'и передать его« None », когда вы не хотите копировать в классе с длинным регистром –

0

Если вы просто хотите произвольного ИНТ поля,

scala> case class BigCase(ids: Int*) 
defined class BigCase 

scala> BigCase(1 to 3 : _*) 
res3: BigCase = BigCase(Range 1 to 3) 

Затем вернитесь назад и исправьте количество полей?

или более произвольно,

scala> case class BigCase[A](ids: A) 
defined class BigCase 

scala> BigCase(1,2,3) 
res7: BigCase[(Int, Int, Int)] = BigCase((1,2,3)) 

scala> BigCase(1,2,"three") 
res8: BigCase[(Int, Int, String)] = BigCase((1,2,three)) 
+0

BigCase на самом деле представляет собой конкретный разнообразный класс со строками , DateTime, Int, Options и т. Д. – BZapper

+0

Если вы просто хотите контейнер, с подробностями вы собираетесь немного поработать, а затем res8. Вы также можете просто «набрать C = (Int, Int, String)». –

1

Предполагая, что я понял вопрос правильно, ???: BigCase будет компилироваться и работать везде, где вы хотите BigCase. Если вы хотите использовать заполнитель в нескольких местах, вы можете использовать val bc: BigCase = ???.

В самом деле, учитывая тип insert, insert(???) уже должен работать нормально, так что не ясно, что вы имеете в виду в этом комментарии:

рода как вызов вставки (???), но все еще есть компилятор, верните правильный тип возврата

Смежные вопросы