【问题标题】:Scala Tuple DeconstructionScala 元组解构
【发布时间】:2010-05-05 20:46:28
【问题描述】:

我是 Scala 新手,遇到了一个让我烦恼的小问题。

并行初始化两个变量效果很好:var (x,y) = (1,2)

但是我找不到并行分配新值的方法:(x,y) = (x+y,y-x) //invalid syntax

我最终会写这样的东西:val xtmp = x+y; y = x-y; x = xtmp

我意识到编写函数式代码是避免这种情况的一种方法,但在某些情况下 var 更有意义。

我有两个问题:

1) 有更好的方法吗?我错过了什么吗?

2) 不允许真正的并行赋值的原因是什么?

【问题讨论】:

标签: scala


【解决方案1】:

Scala 有两种类型的变量:vals 和 vars。 Vals 类似于 Java 的 final 变量,据我所知,根据您的要求,将新值与 vals 并行分配的唯一方法是:

scala> val (x, y) = (1, 2);

scala> val s = (3, 4);
s: (Int, Int) = (3,4)

scala> s._1
res1: Int = 3

scala> s._2
res2: Int = 4

【讨论】:

  • 我明白为什么你不能为 val 分配新值。我说的是变量的并行分配。在我的问题的代码中,x 和 y 都是 vars。
  • 他问你能不能做val (x,y) = (1,2)var (x,y) = (1,2)那你为什么不能做var x; var y; (x,y) = (1,2)
【解决方案2】:

不幸的是,你不能在 Scala 中做多个赋值。但是,如果它们适合您的问题,您可以使用元组:

scala> var xy = (1,2)
xy: (Int, Int) = (1,2)

scala> xy = (xy._1 + xy._2, xy._2 - xy._1)
xy: (Int, Int) = (3,1)

这样,xy 是一个有两个值的元组。第一个值可以使用xy._1 访问,第二个值可以使用xy._2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多