【问题标题】:Assign values of a tuple to single variables in Scala将元组的值分配给Scala中的单个变量
【发布时间】:2020-01-11 15:58:00
【问题描述】:

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


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

感谢您的回答。

【问题讨论】:

  • val (a, b) = getTuple() - 不需要使用可变变量。
  • @LuisMiguelMejíaSuárez 抱歉,不得不更改问题。 getTuple 方法是否必须在另一个方法中运行...所以这不起作用。
  • 你能解释一下你在做什么吗? vars 是一种不好的做法,尤其是未初始化的做法,而且 init 这个名字听起来像一个构造函数。

标签: scala tuples


【解决方案1】:

正如您在 Scala 语言规范的 Section 6.15 Assignments 中看到的,赋值表达式的左侧必须是裸标识符:

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, ???)

模式匹配仅适用于值定义(请参阅Section 4.1 Value Declarations and Definitions)和变量定义(请参阅Section 4.2 Variable Declarations and Definitions)。

所以,以下两个都是合法的:

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

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

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

【讨论】:

    【解决方案2】:

    元组解构是对 unapply 伴随对象的 unapply 方法的不透明调用,又名 extractor object。 正如文档所暗示的那样,只能使用提取器对象进行变量初始化,而不能进行赋值。

    所以,唯一可能的方法就是这样使用它:

    def getTuple = (1,2)
    
    def main() = {
        val (a,b) = getTuple
        // use a,b
    }
    

    您使用var 的事实可能表明您存在设计缺陷。尝试重构您的代码或指定您尝试使用 var 解决的确切问题以证明其使用的合理性(尽管您尝试使用提取器执行的操作仍然是不可能的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多