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 とは何者か、が疑問に。


また、すっきりしないのが、ブロック構文と関数とメソッドの違い。まだよく調べていないんだけど、何か微妙に様子が異なる?今日中に考えをまとめて、明日聞くことにしよう。