Scala、というか関数言語初心者の自分には驚きなので、
書いておこうと思いました。
まず、
def
について。scala> def hoge(x:Int, y:Int):(Int, Int) = if(x > y) (x, y) else (y, x) hoge: (Int,Int)(Int, Int) scala> hoge(-1,1) res0: (Int, Int) = (1,-1) scala> hoge <console>:6: error: missing arguments for method hoge in object $iw; follow this method with ` ' if you want to trea it as a partially applied function hoge ^ scala>
どうやら
def
は暗黙のオブジェクト$iw
に対してメソッドを定義しているようです。では一方の、
val
変数に関数を結びつける場合は、こうなります。scala> val huge = (x:Int, y:Int) => if(x < y) (x, y) else (y, x) huge: (Int, Int) => (Int, Int) = <function> scala> huge(-1,1) res1: (Int, Int) = (1, -1) scala> huge res2: (Int, Int) => (Int, Int) = <function>で、この場合は、
val huge
に対してメソッドが割り当てられているので、引数なしでこのメソッドを呼び起こしても、定義そのものが返ってくる。
どちらが使いやすいかというと、後者のほうがやり安い気がする。
それはscalaコマンド(引数なし)で起動したときの対話環境の話でして、普通のScalaプログラムだと
返信削除> どうやらdefは暗黙のオブジェクト$iwに対してメソッドを定義しているようです。
という事は特に無いです。ちなみに、何故対話環境で$iwなるものがあるかというと、defで定義されたものは(例外的なケースをのぞいて)どっかのオブジェクトに所属してなければいけないので、そのために$iwがあります。