似て非なるメソッド定義

 昨日の記事は何かを見間違えたらしく、まったく正確性にかけるものでした。お詫びいたします。

 さて

 以下のようなクラスがあったとします。

class Hoge {
  def foo(arg: String) = java.lang.Boolean.parseBoolean(arg)

  def bar = java.lang.Boolean.parseBoolean(_)
}

 foo と bar は同じように使えます。

val hoge = new Hoge()

val foo = hoge.foo("true")
val bar = hoge.bar("false")

 Scala ビギナーの私はこれにハマりました。何せ、この二つのメソッドは同じ意味だと思っていたからです(糖衣構文かなんかだと思っていた)。しかし、この二つは違う意味なんですね。

 つまり、メソッド foo は、String 型の引数をとり、Boolean 型の戻り値を返すメソッドであるのに対して、メソッド bar は、引数をとらずに「String 型の引数をとり Boolean 型の戻り値を返す関数」型の戻り値を返すメソッドなんですね。

 ということで

val fooFunc = hoge.foo // これはコンパイルエラー
val barFunc = hoge.bar // これはコンパイルできる


Scala は奥が深いですわ〜。