Я не знаю, как это сделать, но я думаю, что, возможно, это поможет лучше понять, что именно вы хотите, чтобы произошло.Рассмотрим класс типа
case class Foo(x: Int, y: Int) extends Swappable[Int] {
val z = x
}
Теперь, если у вас есть f = Foo(1, 2)
, должен ли f.swap
дать вам Foo
где x != z
?Если это так, то в Scala нет способа создать Foo
как этот.Если нет, то что на самом деле означает «поменять местами x и y»?
Возможно, вы действительно ищете что-то вроде этого:
trait Swappable[A,T] {
this: A =>
val x: T
val y: T
def cons(x: T, y: T): A
def swap = cons(y, x)
}
case class Foo(x: Int, y: Int) extends Swappable[Foo,Int] {
val z = x
def cons(x: Int, y: Int) = copy(x=x, y=y)
}
Но я не уверен.