首页 > 解决方案 > 将元组的值分配给Scala中的单个变量

问题描述

将元组的值分配给单个变量是否有很好的可能性?这是我想做的,但它会引发错误:


var a : Int = _
var b : Int = _

def init() {
   (a,b) = getTuple() // returns (Int, Int)
}

def someFunction = {    
    // use a here
}


def someOtherFunction = {    
    // use b here
}
Error: ';' expected but '=' found.
    (a, b) = getTuple()

我真的必须做这 ._1 和 ._2 的事情吗?


val tuple = getTuple() // returns (Int, Int)
a = tuple._1
b = tuple._2

谢谢回答。

标签: scalatuples

解决方案


正如您在 Scala 语言规范的第 6.15 节赋值中所见,赋值表达式的左侧必须是裸标识符:

foo = ???
// either an assignment to a local mutable `var` or syntactic sugar for:
foo_=(???)

会员访问:

foo.bar = ???
// syntactic sugar for:
foo.bar_=(???)

或方法调用:

foo(bar) = ???
// syntactic sugar for:
foo.update(bar, ???)

模式匹配仅适用于值定义(参见第 4.1 节值声明和定义)和变量定义(参见第 4.2 节变量声明和定义)。

因此,以下两种情况都是合法的:

var (a, b) = getTuple()
val (a, b) = getTuple()

顺便说一句,您的代码中有许多非常不习惯的东西:

  • 将空参数列表传递给方法调用是非常不寻常的。通常,没有参数的方法应该没有参数列表,而不是一个空的参数列表。唯一的例外是具有副作用的方法,其中空参数列表用作一种“警告标志”,但具有副作用的方法也非常不习惯。所以,getTuple应该像这样定义和调用:
    def getTuple = ???
    getTuple
    
    代替
    def getTuple() = ???
    getTuple()
    
  • 另一方面,如果该方法确实有副作用,则不应调用它,getTuple因为这意味着该方法“获得”了某些东西,并且没有迹象表明它也改变了某些东西。
  • 在 Scala 中,getter 和 setter 不被调用getFoosetFoo而是fooand foo_=,因此该方法应该被调用tuple
  • 可变变量也是高度非惯用的,它们可能更应该是vals。

推荐阅读