我试图将类实例隐式解构为元组以创建更好的 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 线程表明此功能是不可能的,但我希望从那时起事情发生了变化,或者有可用的解决方法。