【问题标题】:Scala multiple assignment to existing variableScala对现有变量的多重赋值
【发布时间】:2011-03-21 21:30:38
【问题描述】:

我可以做类似的事情

def f(): Tuple2[String, Long] = ...
val (a, b) = f()

如果变量已经存在怎么办?我在过滤器上运行相同的数据集,我不想链接它们(长名称等)。这是我尝试过的,但它抱怨期待;而不是 = 在最后一行:

var a = ...initialization for this data
var b = ...some other init
(a, b) = g(a, b) // error: expected ';' but found '='

有没有办法避免中间元组?

【问题讨论】:

  • 我手边没有源代码,但我记得在某处读到这样的多重 var 分配是个坏主意,并且 scala 不支持。这是几个月前的事了(谁知道原件是什么时候写的),但我的理解是你需要一个中间人。
  • Scala Tuple Deconstruction 的可能重复项

标签: scala assignment-operator


【解决方案1】:

我找到的解决方法是这样的:

// declare as var, not val
var x = (1,"hello")  
// x: (Int, String) = (1,hello)

// to access first element
x._1
// res0: Int = 1

// second element
x._2
// res1: String = hello

// now I can re-assign x to something else
x = (2, "world")
// x: (Int, String) = (2,world)

// I can only re-assign into x as long the types match
// the following will fail

x = (3.14, "Hmm Pie")
<console>:8: error: type mismatch;
 found   : Double(3.14)
 required: Int
       x = (3.14, "Hmm Pie")

【讨论】:

    【解决方案2】:

    正如亚历克斯所指出的,简短的回答是否定的。您的代码的情况是这样的:当 ab 已经是当前范围内的绑定变量时,(a, b) 表示“获取 a 和 b 的值并从中构造一个元组。”

    因此,

    (a, b) = ...
    

    等价于

    (new Tuple2(a, b)) = ...
    

    这显然不是你想要的(除了荒谬之外)。

    您想要的语法(一次分配给多个变量的能力)根本不存在。您甚至不能一次将 相同的值 分配给多个预先存在的变量(在许多其他语言中发现的常用语法“a = b = ...”在 Scala 中不起作用。)我不要认为 vals 比 vars 获得优待是偶然的;他们几乎总是一个更好的主意。

    听起来所有这些都发生在某种循环中,并重复分配。这不是非常惯用的 Scala。我建议您尝试在程序中消除 vars 的使用,并以更实用的方式做事,使用 map、flatMap、filter、foldLeft 等。

    【讨论】:

    • 多变量赋值的Scala语法是var a,b,c = 0它使用​​逗号,而不是多个等号。
    • 再读一遍我说的。我说的是在一个语句中分配多个 pre-existing 变量,而不是用初始值声明新变量。前者是 OP 正在寻找的,而 Scala 不支持的(据我所知)。
    【解决方案3】:

    如果您总是在过滤器等上运行“相同的数据集”,则表明它们以某种方式属于一起,因此您应该考虑使用元组或专用类(通常是这样的案例类)对它们进行分组例)。

    【讨论】:

      【解决方案4】:

      它适用于新值,因为该语法被视为模式匹配,就像 case 语句一样。所以,正如Alex 所说,你不能这样做。

      【讨论】:

        【解决方案5】:

        简短回答:没有。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-02-19
          • 2020-07-23
          • 2014-03-22
          • 1970-01-01
          • 1970-01-01
          • 2016-07-21
          • 2011-01-23
          相关资源
          最近更新 更多