当Scala中的赋值语句后跟花括号时,分号推断不起作用?

pis*_*hen 3 scala

http://www.artima.com/pins1ed/builtin-control-structures.html#7.7,我看到以下代码

val a = 1;
{
  val a = 2
  println(a)
}
println(a)
Run Code Online (Sandbox Code Playgroud)

它说这里需要分号,但为什么呢?

根据http://www.artima.com/pins1ed/classes-and-objects.html#4.2中的规则,我认为分号应该是自动添加的

  1. val a = 1 可以是一份法律声明.
  2. 下一行开头{,我认为可以开始一个法律声明.(因为如果我添加分号并将前两行分成两个语句,则没有编译错误.)
  3. val a = 1 不在括号或括号中.

0__*_*0__ 5

因为这是合法的电话apply:

implicit class RichInt(i: Int) {
  def apply(thunk: => Unit) = 33
}

val a = 1
{
  val a = 2
  println(a)
}
println(a)  // 33 !
Run Code Online (Sandbox Code Playgroud)

1 { ... }是的缩写1.apply {...}.现在默认情况下apply没有定义Int,但正如隐式浓缩显示的那样,它是完全可能的.


编辑:分号推断条件在Scala语言规范的 "§1.2换行符"中描述.推断的分号nl在该文本中称为"特殊标记" ".

一般来说,给出了三条规则(在本博客文章中对 ex-negativo 进行了总结),在您的示例中,它们都令人满意.仍未推断出分号的原因在文中进一步说明.

Scala语法...包含可选nl令牌但不接受分号的作品.这导致其中一个位置的换行符[!]不终止表达式或语句.

这种额外规则的相关案例如下:

接受一个新的线标记
- 在左括号"{"之前,如果该标记是当前语句或表达式的合法延续......

例1.2.2显示了我在评论中提到的匿名子类的情况.