我喜欢Scala的一件事是他们给你多种方式来写你的陈述,但这也为我提出了一些问题。
我一直在摆弄一个简单的if语句,并发现它的行为并不像我期望的那样。请查看以下代码段:
var a = 0
var b = 0
if(false)
a += 1
b += 1
println(a) // 0
println(b) // 1
在这个小例子中,我假设a和b在脚本末尾都是零,但事实并非如此。当我将大括号添加到if语句时,它确实像我期望的那样工作。
可能是我在这里遗漏了一些东西,但对我而言,这似乎是一种相当混乱的语法。在调试其他人的代码时很容易被忽略,所以我对这种语法风格背后的原因非常好奇。
任何意见/解释都将不胜感激!
答案 0 :(得分:6)
为什么呢?这很有道理。 Scala不像具有显着空白区域的python(实际上你的代码段看起来很像python;))。如果您希望 if 来管理多个语句,则需要大括号。
在这样工作的语言中,样式指南通常建议在 if 之后始终使用大括号,以避免您所采取的确切混淆。
就个人而言,如果 ,如果 语句后跟一行而没有花括号,我就没有问题。
答案 1 :(得分:5)
if
的语法是(简化):
if (<bool expr>) <expr> [else <expr>]
你的
if(false)
a += 1
b += 1
被理解为
if (false) a += 1
b += 1
因为a += 1
是一个表达式。也许花括号更清晰
if (false) {
a += 1
}
b += 1
请注意,代码块也是一个表达式,它可以计算出它所评估的最后一个表达式。因此,如果需要将它们放在块中,则将两个表达式放在
中if (false) {
a += 1
b += 1
}
当然,通过缩进没有类似python的块定义。