是否可以在scala中一次分配两个值?我的意思是代码:
var a: Int = 0
var b: Int = 0
(a, b) = methodReturningTupleOfInts()
当然,methodReturningTupleOfInts返回(Int, Int)
答案 0 :(得分:1)
当然可以使用值。
能够轻松地做这些事情是功能语言的卖点。
def myMethod(i:Int) = (i+1, i+2)
@Test
def testit() {
val (a,b) = myMethod(5)
Assert.assertEquals(a, 6)
Assert.assertEquals(b, 7)
}
请注意我们上面使用了 val 。这里发生的事实上是一个模式匹配来提取复合词的组成部分。但是使用变量是不可能的。因此不可以立即对变量进行多次分配。
因为,更改值可能会产生副作用。这将导致很多复杂性,因为那时执行这种匹配和分配的顺序是相关的。因此,如果你真的需要一个变量,那么你需要明确地提取元组的组件并逐个分配它们
def myMethod(i:Int) = (i+1, i+2)
var (a,b) = (2,3)
@Test
def testit() {
Assert.assertEquals(a, 2)
Assert.assertEquals(b, 3)
val result = myMethod(5)
a = result._1
b = result._2
Assert.assertEquals(a, 6)
Assert.assertEquals(b, 7)
}
注意元组(a,b)的复合初始化有效并且没问题。但是不允许用复合赋值来改变它。 (a,b) = myMethod(5)
无法编译