【发布时间】:2019-01-31 17:11:28
【问题描述】:
我正在学习如何在 Scala 中编程,并被告知分号在 Scala 中是可选的。因此,考虑到这一点,我尝试使用以下没有分号的嵌套代码块。但是,它会在 Scala REPL 中引发错误
scala> { val a = 1
| {val b = a * 2
| {val c = b + 4
| c}
| }
| }
<console>:17: error: Int(1) does not take parameters
{val b = a * 2
带有半冒号的样本工作得非常好。
scala> { val a = 1;
| { val b = a*2;
| { val c = b+4; c}
| }
| }
res22: Int = 6
因此,在我看来,分号并不是真正的可选,在某些情况下是强制性的。请问在什么情况下分号是必填的?
【问题讨论】:
-
@Bergi 你在说什么?这里是a typical piece of Scala code。它每 177 行包含三个分号,恰好在
{}中包含多个表达式的情况下(无缘无故,在这种情况下,所有这些分号都可以省略,但是作者懒得输入换行符,显然)。 -
@AndreyTyukin,你的意思是我错误的结果是由于缺少换行符?
-
大多数时候(我估计大约 99.5% 左右),只有当没有分号的表达式没有任何意义时,分号才是强制性的。例如,
{val b = a * 2 { val c = b + 4 ; c }}没有任何意义,因为2没有可以将块{ val c = b + 4; c }作为参数的apply方法。将其与例如Future伴随对象,您可以在其中毫无问题地编写Future { val c = b + 4; c },因为与2不同,对象Future确实提供适当的apply方法。 -
@AndreyTyukin,感谢您的解释。我认为在这种情况下将语句放在多行就足够了。
标签: scala syntax semicolon-inference