Скала скрытого отменить
Я пытаюсь неявно деконструировать экземпляр класса в кортеж, чтобы создать лучший синтаксис 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]
Я знаю, что могу определить сопутствующий объект с помощью неприменимого метода и вручную обработать деконструкцию (или явно вызвать выше неявно), но это создает нежелательный шаблон.
Edit Ok, просто чтобы предоставить немного больше контекста, 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 классом case (или добавить собственный объект-компаньон в существующий класс Pair) и Pair(a,b) <- tableA join tableB on(...)
каждый раз, когда я присоединяюсь к таблицам (читай: часто)
оригинал
Есть ли способ осуществить это в Scala 2.10 или 2.11? Существуют более старые потоки SO с 2.8/2.9 днями, которые указывают, что эта функциональность невозможна, но я надеюсь, что с тех пор что-то изменилось или что есть обходной путь.
2 ответа
Вам необходимо установить тип a и b в явном виде:
val(a,b): (Int, Int) = pair
Если вы просто хотите извлечь левый и правый (я думаю, из вашего примера), почему бы не решить вашу проблему с еще меньшим количеством кода:
case class Pair[A, B](left: A, right: B)
val pair = Pair(1, 2)
val Pair(a, b) = pair
println(a, b)