我试图隐式地将类实例解构为元组以创建更好的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线程表明这种功能是不可能的,但我希望自那时起事情发生了变化,或者有可用的解决方法。
答案 0 :(得分:2)
您需要设置a和b的类型:
val(a,b): (Int, Int) = pair
答案 1 :(得分:1)
如果你只想提取左右(我猜你的例子),为什么不用更少的代码来解决你的问题:
case class Pair[A, B](left: A, right: B)
val pair = Pair(1, 2)
val Pair(a, b) = pair
println(a, b)