似て非なるメソッド定義
昨日の記事は何かを見間違えたらしく、まったく正確性にかけるものでした。お詫びいたします。
さて
以下のようなクラスがあったとします。
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 は奥が深いですわ〜。