正如我从书中读到的那样,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
。为什么这两个赋值运算符不是从左到右分组的?
答案 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
因此,我们在这里
varid
为a
,Expr
为b = c
,a
被赋予b = c
评估的值,恰好是Unit
。 稍后见What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?
请注意,上述内容假设b
为var
,例如
val c = 17
var b = 3
val a = b = c
在第三行重新分配b
(否则你会获得error: reassignment to val
)。如果由于某种原因想要将相同的值分配给两个val
,可以使用
val c = 17
val a, b = c