Scala自習(その2)

すべてがオブジェクト

オブジェクトとは何か? という重要かつ不毛な議論は省略。

Scalaのオブジェクトシステムは、構文的にはJavaに近い……嘘。若干の面影があるというだけで、独自色はけっこう強い。

しかしながら、基本的な概念はそう変わらない。クラスがあり、インスタンスがあり、メソッドがある。インスタンスはメソッドを通して操作される。

メソッド呼び出しは大抵の言語と同じく

object.methodName(arguments)

の構文による。

Scalaではすべてがオブジェクトである。つまり、全てのデータがメソッド呼び出しに何らかの反応を示す。Rubyではおなじみ*1

101.toString  // 文字列"101"が返る

演算子も例外ではなくメソッド呼び出し。

2 + 3
(2).+(3)

2つは同じ。2を丸括弧でくくるのは、実数2.と解釈されるのを避けるため。ちょっと危ない気はしなくもないが、まあ後者はほとんど使わないだろう。

つまりScalaは中置演算子を特別扱いしない。

1 to 100
1.to(100)

前者のtoはあたかも中置演算子であるかのように書かれているが、実際は後者のようなメソッド呼び出しにすぎない。+や-などは、たまたまメソッド名が記号だったというだけ。

となると、ひとつ引数をとる全てのメソッドがドットを省略して演算子風に書けることになるわけだが、演算子には優先順位と結合性の問題がつきまとう*2。もちろんその辺を解決するための規則は用意されているが、後回し。

上の例を評価すると、Rangeオブジェクトが得られる。Rangeは離散的な範囲を表す。この場合は1から100までの整数。例えばこんな使い方をする。

(1 to 5).foreach(println)

1から5までの値が出力される。これはprintlnを引数にした、いわゆる高階関数なのだが、Scala的な省略記法も適用されている。

つづく?

メモ

  • この辺はほとんどRubyと同じようなもの。ただしScala演算子定義はかなり柔軟で、:::とか作れる。
  • おおざっぱな記述に留めても終わりが見えない。まだリストすら出てないって。終わるのコレ?

*1:「すべてがオブジェクト」の元祖はSmalltalkらしいのだが、よく知らない

*2:前置演算子の扱いにも触れていない