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