Scala的非花括号IF语句

时间:2016-05-24 11:30:36

标签: scala syntax

我喜欢Scala的一件事是他们给你多种方式来写你的陈述,但这也为我提出了一些问题。

我一直在摆弄一个简单的if语句,并发现它的行为并不像我期望的那样。请查看以下代码段:

var a = 0
var b = 0

if(false)
  a += 1
  b += 1

println(a) // 0
println(b) // 1

在这个小例子中,我假设a和b在脚本末尾都是零,但事实并非如此。当我将大括号添加到if语句时,它确实像我期望的那样工作。

可能是我在这里遗漏了一些东西,但对我而言,这似乎是一种相当混乱的语法。在调试其他人的代码时很容易被忽略,所以我对这种语法风格背后的原因非常好奇。

任何意见/解释都将不胜感激!

2 个答案:

答案 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的块定义。