在scala中分配两个值

时间:2013-11-22 18:24:33

标签: scala

是否可以在scala中一次分配两个值?我的意思是代码:

var a: Int = 0
var b: Int = 0

(a, b) = methodReturningTupleOfInts()

当然,methodReturningTupleOfInts返回(Int, Int)

1 个答案:

答案 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)无法编译