読者です 読者をやめる 読者になる 読者になる

$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Scala入門してる - 演算子編

コップ本読みながら、Scala入門してる。今は第05章の基本型と演算子を読んでる。

Scala演算子はすべてメソッド呼び出しらしい。分かりやすくて良い。

例えば

val x = 1 + 1

val x = (1).+(2)

と同じらしい。分かりやすい。


単項演算子みたいなのもあると思うのですが、これはunary_hogeみたいなのにマッピングされるみたい。つまり

val x = -1

val x = (1).unary_-()

と同一って感じっぽい。分かりやすい。


ちなみにすべてのメソッドは中置演算子のようにできるみたい。例えばStringのindexOfは単なるメソッドだけど、中置演算子として書ける。

val s = "Hello, world!"
s indexOf 'o'

これを利用することで、for文で使ってたtoがなぜああいうふうに使えるか分かる。

for (i <- 1 to 10) {
  println(i)
}

これは

for (i <- (1).to(10)) {
  println(i)
}

となって、単にtoメソッドが呼ばれているだけみたい。なるほど。


toの実装を見るために、実際にscalaのコードを見に行ってみる。https://github.com/scala/scala

まずIntはどのへんにあるかなと思ったら、https://github.com/scala/scala/blob/2.11.x/src/library/scala/Int.scala にあった。これはabstract classっぽいので、実際の実装はあんまりなかった。たぶんJavaのソースに実装がありそう?

ここにはunary_~とかunary_-とかが書いてあったので、これが前置演算子になるんだなーと分かった。https://github.com/scala/scala/blob/2.11.x/src/library/scala/Int.scala#L39..L43

さらにgit grep 'def to('とかして探してみると、src/library/scala/runtime/RichInt.scalaというファイルが見つかった。ここにtoの定義を発見。https://github.com/scala/scala/blob/2.11.x/src/library/scala/runtime/RichInt.scala#L71..L71 。Range.Inclusiveというのが返るみたい。どうやってRichIntとかが呼ばれるのかよくわからないのだけど、聞いてみるとimplicit conversionみたいな仕組みが使われるみたい。よくわからんけど、もっと読んでったら分かりそう。

会話もした。







まとめ

今回はScala演算子の使われ方についてちょっとだけ調べた。全部メソッドなのは分かりやすくていい。ちょっとずつScala勉強してるけど、PerlRubyの中間っぽい感じに見えてかわいい。

前回のエントリー

blog.shibayu36.org