在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中的规则,我认为分号应该是自动添加的
val a = 1 可以是一份法律声明.{,我认为可以开始一个法律声明.(因为如果我添加分号并将前两行分成两个语句,则没有编译错误.)val a = 1 不在括号或括号中.因为这是合法的电话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显示了我在评论中提到的匿名子类的情况.
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |