1

我试图将类实例隐式解构为元组以创建更好的 DSL 语法。

这是我正在尝试做的一个简化示例:

class Pair[A,B](a: A, b: B){
  def left = a
  def right = b
}
val pair = new Pair(1,2)
implicit def unpair[T1 <: Int, T2 <: Int](p: Pair[T1,T2]) = {
  (p.left, p.right)
}
val(a,b) = pair

结果是:

error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: Pair[Int,Int]

我知道我可以使用 unapply 方法定义一个伴随对象并手动处理解构(或显式调用上面的隐式),但这会产生不需要的样板。

编辑 好的,只是为了提供更多上下文,Pair嵌入在实现 map、flatMap 和 withFilter 的实例中(即用于理解)。因此,所需的用法如下所示:

val q = for{
  (a,b) <- tableA join tableB on(...)
  (c,d) <- tableC leftJoin tableD on(...)
  ....
} yield(a,b,c,d,...)

我想避免的是让 Pair 成为一个案例类(或向现有的 Pair 类添加一个自定义伴随对象)并且Pair(a,b) <- tableA join tableB on(...)每次我加入表时都必须这样做(阅读:经常)

原来的

有没有办法在 Scala 2.10 或 2.11 中解决这个问题?从 2.8/2.9 天开始有一些较旧的 SO 线程表明此功能是不可能的,但我希望从那时起事情发生了变化,或者有可用的解决方法。

4

2 回答 2

2

您需要明确设置 a 和 b 的类型:

 val(a,b): (Int, Int) = pair
于 2014-05-07T08:14:52.837 回答
1

如果您只想提取左右(我从您的示例中猜测),为什么不用更少的代码来解决您的问题:

case class Pair[A, B](left: A, right: B)

val pair = Pair(1, 2)

val Pair(a, b) = pair

println(a, b)
于 2014-05-07T09:14:04.333 回答