在Java中,我经常发现自己在条件的每个分支中分配多个最终变量,如下所示:
final _ x;
final _ y;
if (_) {
x = _;
y = _;
} else {
x = _;
y = _;
}
在Scala中我知道可以使用该技术分配单个val:
val x = {
if (_) {
_;
} else {
_;
}
}
实际上,可以通过让块返回与变量模式匹配的元组来修改上述方法以分配给多个变量:
{
if (_) {
_;
} else {
_;
}
} match { case (x, y) => _ }
但我发现这种语法很尴尬。是否有一种更简单的方法,理想情况下类似于Java代码,可以做我想做的事情?
答案 0 :(得分:8)
scala> val (x,y) = if (true) (3,"blah") else (1,"blis")
x: Int = 3
y: String = blah
它看起来像一个元组赋值,但它实际上分配给多个val。 (好吧,它实际上都是。)
答案 1 :(得分:4)
是的,您可以指定要将值分配给的多个实例,就像匹配语句中的情况一样(并使用相同的基础概念 - unapply)。你看到这种方式的最典型的方式是以解构的元组的形式,例如(根据你的问题结合if-else):
val (x,y,z) = if (true) (x_value, y_value, z_value) else (alt_x, alt_y, alt_z)
(正如@jwvh的回答所示)
可以进一步使用unapply
方法来处理包含它的任何数据类型(包括所有案例类)。例如:
scala> val head :: tail = if (true) List(3,4,5,6) else List(9,8,7)
head: Int = 3
tail: List[Int] = List(4, 5, 6)
或
scala> case class Foo(ix: Int, bar: String)
defined class Foo
scala> val f@Foo(the_ix, the_bar) = if (true) Foo(2, "baz") else Foo(5, "wibble")
f: Foo = Foo(2,baz)
the_ix: Int = 2
the_bar: String = baz
scala> f
res3: Foo = Foo(2,baz)
scala> the_ix
res4: Int = 2