案例类的占位符?斯卡拉的理解力

时间:2017-01-26 23:16:24

标签: scala for-comprehension

我有一段代码(简化):     import scala.concurrent.Future

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")
}

它工作正常,但是当我有一个包含15个字段的巨大“BigCase”类时,能够编写

会很好
  

刀片(_)

,而不是

  

刀片(BigCase(1,2,3,4,5,6 ...))

,特别是在剔除阶段。但是一旦我做insert(_),id变成了“Nothing”类型,这使得进一步的步骤难以构成。

周围有办法吗?

3 个答案:

答案 0 :(得分:1)

我不确定您的代码应该如何工作,但是您在理解中第一次定义了BigCase实例。没有办法缩短声明本身,但我认为如果在for comprehension之前定义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] = scala.concurrent.impl.Promise$DefaultPromise@53bd8fca scala> r.onComplete(println) Success(1) 实例,则代码更有意义:

crypto.js:73
  this._handle.update(data, encoding);
           ^

TypeError: Data must be a string or a buffer
    at TypeError (native)
    at Hash.update (crypto.js:73:16)
    at new WP_Auth (C:\xampp\htdocs\livetrader\chat\app-backend\wp-auth.js:27:6)
    at Object.exports.create (C:\xampp\htdocs\livetrader\chat\app-backend\wp-auth.js:148:9)
    at Object.<anonymous> (C:\xampp\htdocs\livetrader\chat\app-backend\socket.js:20:6)
    at Module._compile (module.js:556:32)
    at Object.Module._extensions..js (module.js:565:10)
    at Module.load (module.js:473:32)
    at tryModuleLoad (module.js:432:12)
    at Function.Module._load (module.js:424:3)

答案 1 :(得分:1)

假设我正确理解了这个问题,???: BigCase将编译并在您想要BigCase的任何地方工作。如果要在多个位置使用占位符,可以使用val bc: BigCase = ???

事实上,鉴于insert的类型,insert(???)应该已经正常工作,所以在此评论中你不清楚你的意思:

  

有点像调用insert(???),但仍然有编译器返回正确的返回类型

答案 2 :(得分:0)

如果你只想要任意的int字段,

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))