【问题标题】:How would I express a chained assignment in Scala?我将如何在 Scala 中表达链式赋值?
【发布时间】:2011-01-27 09:23:50
【问题描述】:

如何在 scala 中表达以下 java 代码?

a = b = c;

顺便说一句,我正在重新分配变量(不是声明)。

【问题讨论】:

    标签: scala expression variable-assignment


    【解决方案1】:

    只有在声明 varval 时才能使用 Scala 中最接近的快捷语法。

    scala> val c = 1  
    c: Int = 1
    
    scala> val a, b = c
    a: Int = 1
    b: Int = 1
    

    来自 Scala 参考,第 4.1 节

    值声明 val x1 , ... , xn:T 是序列的简写 价值声明 val x1: T ; ...; val xn: T. 值定义 val p1, ..., pn = e 是一个 值序列的简写 定义 val p1 = e ; ...; val pn = e 。值定义 val p1, ... , pn : T = e 是 值定义序列 val p1 : T = e ; ...; val pn: T = e .

    这不适用于重新分配给var。由于此处解释的原因,C/Java 样式不起作用:What is the Motivation for Scala Assignment Evaluating to Unit

    【讨论】:

    • 请注意,右侧的表达式将被计算多次(每个变量一次):例如val a, b = new Object 中的 ab 将引用不同的对象。
    【解决方案2】:

    利用赋值的左侧在语法上是一个模式这一事实。 (请参阅 SLS 中的 PatVarDef > PatDef > Pattern2。)

    a = b = 5

    scala> val a@b = 5
    a: Int = 5
    b: Int = 5
    

    x = y = z = 新对象

    scala> var x@(y@z) = new Object
    x: java.lang.Object = java.lang.Object@205144
    y: java.lang.Object = java.lang.Object@205144
    z: java.lang.Object = java.lang.Object@205144
    

    请注意,右侧站点上的表达式只计算一次。

    不幸的是,这种语法不适用于 re分配(因此对于 x = y = value,您仍然必须执行 x = value; y = x)。

    另见[scala-language] Chained assignment in Scala

    【讨论】:

      【解决方案3】:

      表达式(赋值)b = c 的“返回类型”恐怕是Unit,这意味着这个语法无效。

      【讨论】:

        【解决方案4】:
        b = c; a = b
        

        尴尬,我知道。这就是 Scala 几乎告诉你“不要那样做”。将其视为用于块分隔的 Python 空间标识的 Scala 版本。

        【讨论】:

          【解决方案5】:
          val b = c
          val a = b
          

          你不会写

          val a = b = c
          

          因为它定义了一个表达式

          【讨论】:

          • var,当变量是可变的而不是最终的。
          • 没有速记吗?写 b = c; 似乎很愚蠢a = b
          猜你喜欢
          • 1970-01-01
          • 2022-06-18
          • 1970-01-01
          • 1970-01-01
          • 2021-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多