Scala School (4)

今日は次の Basics continued に突入。

apply methods

とりあえずこんなことできますよ、という事のみ。apply というメソドを定義しておくとオブジェクトの参照を手続きオブジェクトとして apply (という書き方が正しいのかどうか) できる模様。

scala> class Bar {
     | def apply() = 0
     | }
defined class Bar

scala> val bar = new Bar
bar: Bar = Bar@2ff9e79e

scala> bar()
res0: Int = 0

あるいは例示されているのは Factory Method の例ですね。

object FooMaker {
  def apply() = new Foo
}

object はすぐ下で出てくるんですが、FooMaker() で Foo なオブジェクトが戻るはず。

Objects

ここで factory でよく使う、って書かれてますね。あるいは singleton なオブジェクト、という記述もあります。そして以下は new な演算子が不要になる例らしい。

class Bar(foo: String)

object Bar {
  def apply(foo: String) = new Bar(foo)
}

これで、Bar() の呼び出して Bar のオブジェクトが生成されて戻るのか。あるいはこうした実装 (?) を Companion Object と呼ぶらしい。

Function are Objects

この項も非常に面白いです。ええと Function は trait のセットで、引数が一つの手続きは Function1 という trait のインスタンス、とあります。ここまでで例示されてきた apply というメソドを使って云々、なんですね。
例示されてるソレを REPL に食わせてみます。

scala> object addOne extends Function1[Int, Int] {
     | def apply(m: Int): Int = m + 1
     | }
defined module addOne

おそらく、ですが Function1[Int, Int] は引数は Int 型で Int を戻す手続きオブジェクト、という意味なのかどうか。
そして上で定義した addOne を呼び出しています。

scala> addOne(1)
res1: Int = 2

scala> addOne
res2: addOne.type = <function1>

object である、というのも面白い、というか上の二つの項はこのための導入部分だったのですね。以降に記述があるのですがクラスの中で定義されてるメソド (def を使うもの) と REPL なトップレベルで定義される手続きは異なるもの、という説明があります。
Function* 型のオブジェクトとクラスの中で定義されているメソドとは明らかに異なる、という事なのか。だからクラスの属性に手続きオブジェクト (Function* 型のオブジェクト) を束縛させているものとメソドは違う、ということだったのか。

手続きオブジェクト

Java を継承しつつ Function* というオブジェクトとか trait という仕組みを使うことで上手に手続きオブジェクトを実装したのが Scala という処理系という理解で良いのかどうなのか。

時間切れ

予習付き 30m ではこの程度が限界な模様。