2011年1月20日木曜日

Scalaの関数をvalに結びつける方法とdefで宣言することの違い

いや、べつに大したことではないのですが、

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に対してメソッドが割り当てられているので、

引数なしでこのメソッドを呼び起こしても、定義そのものが返ってくる。





どちらが使いやすいかというと、後者のほうがやり安い気がする。

1 件のコメント:

  1. それはscalaコマンド(引数なし)で起動したときの対話環境の話でして、普通のScalaプログラムだと

    > どうやらdefは暗黙のオブジェクト$iwに対してメソッドを定義しているようです。

    という事は特に無いです。ちなみに、何故対話環境で$iwなるものがあるかというと、defで定義されたものは(例外的なケースをのぞいて)どっかのオブジェクトに所属してなければいけないので、そのために$iwがあります。

    返信削除