http://cappuccino.jp/scala-ja/?Scala%CA%D9%B6%AF%B2%F1%A1%F7%B4%D8%C0%BE-1に行ってきた
Scalaにちょっと興味が出てきたので、勉強会に行ってきた次第です。ちなみに勉強会へは初参加。
とりあえずすっきりしたことをつらつらと。
メソッドと関数(オブジェクト)は違う
クロージャを作る際に、ScalaのREPL上で以下のようなことを行うとエラー。理由は、実はTopオブジェクトみたいなのがいるらしいから。で、メソッドを関数オブジェクトにする場合は、(メソッド名 _) とすればよい。
また、メソッドを関数オブジェクト化した場合、フィールド変数などはちゃんと参照可能になっています。詳しくは調べていませんが、Schemeのクロージャのように、レキシカルスコープなのかしら。
scala> def f(x:Int) = {x + 3} f: (Int)Int scala> var ff = f <console>:5: error: missing arguments for method f in object $iw; follow this method with `_' if you want to treat it as a partially applied function var ff = f ^ scala> var ff = (f _) ff: (Int) => Int = <function> scala> class A(_x:Int) {var x = _x} defined class A scala> var a = new A(3) a: A = A@135b95d scala> (a.x _) res4: () => Int = <function> scala> res4() res5: Int = 3
1 to 5 map fizzBuzz は、(1.to(5)).map((x:Int) => {fizzBuzz(x)})
1はInt型、toはメソッド、5は引数、…となっているのですが、Intにはtoメソッドがない。これはRichIntで定義されており、IntがRichIntのメソッドを利用できるのは、Implicit Conversionという機能によるものだそうです。
その後
その場で懇親会が開かれたのですが、みんな凄いね。
みんなGJ。
個人的には、ついったにも書いたけれど、電車は自動車と違ってある程度移動する方向を制限する代わりにスケールするから電力的な効率がいいってことかな。
えーと何の勉強会でしたっけ。あぁそうだった。スケール重要っていう勉強会でした。
以上。
追記というか大事なこと
keisuke_nさん、講師お疲れ様でした。非常に分かりやすかったです。
また、勉強会には参加されていない方でしたが、勉強会メンバに差し入れをいただきました。ありがとうございました。