感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Scalaのセミコロン推論のルール

スポンサーリンク

この本でScalaの勉強を始めた。

速攻理解!JavaプログラマのためのScalaプログラミング

速攻理解!JavaプログラマのためのScalaプログラミング

取っ付きづらいと言われているScalaを極限までわかりやすく説明してくれている本だ。
Javaと比較してくれるのでわかりやすい。
まだ今日読み始めたばかりなのだが、Javaとは違った面白さがある。

・Scalaはセミコロンをつけない
Scalaには行末にセミコロンが省略されているかを推論する「セミコロン推論」という機能がある。

Scalaは、いくつかの条件以外では「文末にセミコロンがあるもの」と判断するということだ。
では、セミコロンがあるものと判断されない場合は?
以下のコードを見てみよう。

package sample

object HelloScala extends App {
		var i = 10
		var j = 20
		var question = i +
							j
		println("答えは?>" + question)
}

これの出力はどうなるだろうか?

答えは?>30

となる。

つまり、

var question = i +

の部分はセミコロンがあると思われていないということだ。
ルール①文末に文法的に文末と認められていない単語がある場合は、セミコロンが推論されない。

逆に、

package sample

object HelloScala extends App {
		var i = 10
		var j = 20
		var question = i
							+j
		println("答えは?>" + question)
		println("jはどうなった?>" + j)
}

こんな感じだと、

答えは?>10
jはどうなった?>20

というように、

var question = i

にはセミコロンが推論された。
これは、「+」などで終わっていなかったため末尾であると判断されたからだ。

次に、上の例に()をつけてみよう。

package sample

object HelloScala extends App {
		var i = 10
		var j = 20
		var question = (i
							+j)
		println("答えは?>" + question)
		println("jはどうなった?>" + j)
}

すると・・・

答えは?>30
jはどうなった?>20

というように、セミコロン推論はされなかった。
ルール②丸括弧()や角カッコ[]が閉じられていない状態で文末になっている場合は、セミコロン推論されない

その他にも、③次の行が文の先頭として認められていない単語である場合は、セミコロン推論されないというルールがあるようだ。

文字列の場合は、

package sample

object HelloScala extends App {
	var str = "明日は"
				"晴れると"
					"いいな"
	println(str)
}

これだと結果は、

明日は

となり、セミコロン推論されている。

package sample

object HelloScala extends App {
	var str = "明日は" +
				"晴れると"+
					"いいな"
	println(str)
}

結果

明日は晴れるといいな

「+」をつけると、セミコロン推論されずに、文字列をつなげることができるみたい。
あまり「+」でくっつけるのはよくなさそうだけど・・・それはおいおい勉強しよう(JavaでいうとStringBuilderを使うところ)