2016-05-24 3 views
1

私がScalaについて好きなことの1つは、ステートメントを書くための複数の方法を提供していることです。Scalaの非中括弧IFステートメント

私は単純なifステートメントを使いこなしていましたが、その動作は期待通りではないことがわかりました。次のコードスニペットを見て:

この小さな例で
var a = 0 
var b = 0 

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

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

私はAとBの両方が、スクリプトの最後でゼロになることを前提としていますが、これはそうではありません。 ifステートメントに中括弧を追加すると予想されるように動作します。

私はここで何かを見逃しているかもしれませんが、私にはこれはかなり混乱しているようです。他の人のコードをデバッグするときには簡単に見落とすことができるので、この構文スタイルの背後にある理由が非常に不思議です。

ご意見・ご感想をお寄せください。

答えて

5

ifの構文は(簡略化)されている:

if (<bool expr>) <expr> [else <expr>] 

あなたa += 1式であるため

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

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

として理解されます。多分それは、コードのブロックは、それが評価され内部で何でも最後の式に評価されるだけでなく表現であることを

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

注中括弧で明確です。したがって、ブロック内に配置する必要がある場合は、両方の式を内部に配置することができます。

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

もちろん、インデントによるPythonのようなブロック定義はありません。

+0

この回答をお寄せいただきありがとうございます。スカラでは空白が重要ではないことが分かりましたので、中括弧を追加する必要がありました。あなたから提供されたコードスニペットは、本当にこれを明確にしました、ありがとう! – Karsten

6

なぜですか?それは完璧な意味合いがあります。 Scalaは、大きな空白を持つPythonと似ていません(実際には、スニペットはPythonのように見えます)。 を複数のステートメントに適用する場合は、中括弧が必要です。あなたが約取っている正確な混乱を避けるためにする場合は、このような働きを言語で

、スタイルガイドは、多くの場合、常に後に中括弧を使用することをお勧めします。個人的に

、私はシングルラインとノー中括弧が続く if文で何の問題もありません。

+0

初心者として、ifに含まれる式にインデントを使用できると仮定しましたが、今はそうではないことがわかりました。だから今からちょうど中括弧をつけて、混乱しないで!あなたの迅速かつ明確な答えをありがとう! – Karsten