Scala - " val a = b = c"

时间:2015-05-06 16:18:53

标签: scala

正如我从书中读到的那样,scala运算符关联性从左到右,除了运算符以":"炭。

鉴于val a = b = c,它变为val a = (b = c),并使a初始化为单位。

但为什么它不成为(val a = b) = c,并且它导致编译错误,因为使用单位(从a=b返回)来接收c

在我真正键入(val a = b) = c之后,编译器会抱怨illeagal start of simple expression并指向val。为什么这两个赋值运算符不是从左到右分组的?

1 个答案:

答案 0 :(得分:2)

这里要看的重要一点是val a = b = c是一个声明而不是表达式,但优先级和关联性是适用于表达式的概念。

查看Scala 2.11 Language Specification, 4.1 Value Declarations and Definitions,您可以看到

val a = b = c

是属于PatVarDef案例的基本声明,因此可以将其视为(在此varid的特定情况下简化Pattern2部分):

'val' varid '=' Expr

因此,我们在这里

  • 变量标识符varida
  • 表达式Exprb = c
  • a被赋予b = c评估的值,恰好是Unit

稍后见What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?

请注意,上述内容假设bvar,例如

val c = 17
var b = 3
val a = b = c

在第三行重新分配b(否则你会获得error: reassignment to val)。如果由于某种原因想要将相同的值分配给两个val,可以使用

val c = 17
val a, b = c