Scalaのブロック構文、関数、メソッド
昨日の投稿は、関数型っぽくと書いたけれど、どちらかと言うとRubyのブロック構文のようなイメージでした。
関数型っぽく書くとなると、defで関数(なのかメソッドなのか)を定義するのがよいのかと思った次第。
昨日とは違い、REPL上で実施。
scala> def fizzBuzz(x:Int):String = { var ret:String = "" if (x % 3 == 0) ret = "Fizz" if (x % 5 == 0) ret += "Buzz" if (ret.length == 0) ret = x.toString ret } fizzBuzz: (Int)String scala> 1 to 20 map fizzBuzz //ここで関数fizzBuzzを引数なしで渡している res17: RandomAccessSeq.Projection[String] = RangeM(1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, FizzBuzz, 16, 17, Fizz, 19, Buzz) scala> (fizzBuzz _).getClass res18: java.lang.Class[?0] forSome { type ?0 } = class $anonfun$1
ちなみに最後の行は、fizzBuzzのクラスが何かを調べる方法。単純にfizzBuzz.getClass ではエラーが返るので途方に暮れていたところ、id:kmizushima (@kmizu)さんからTwitter経由で教えていただきました。ありがとうございます。
で、何故 _ が必要なのか、そして$anonfun$1 とは何者か、が疑問に。
また、すっきりしないのが、ブロック構文と関数とメソッドの違い。まだよく調べていないんだけど、何か微妙に様子が異なる?今日中に考えをまとめて、明日聞くことにしよう。