implicit def

淡々と続いているscala勉強会@東北、既に第6回目。implicit conversionでナベアツ作りました。

scala@tohoku、週に1度1時間、ustやskypeを使ってネットでやってる勉強会です。私はscalaで仕事できているわけではないのですが、勉強はコツコツ続けています。週に1度の目標があるのはいいペースメイキングになりますね。

最初はscalaそのもののコードリーディングから始まったのですが、
初学者も入りやすいように「みんなのコード」で自作コードをさらして、みんなで読んで添削してもらう。ということをやってます。

が、第5回あたりから参加者が減ってしまいました ><
みなさんが参加しやすい時間も調整中。

私は初めて知った文法で何かやってみる的なコードしか書けませんが、暖かく迎えてくれるので、大変にうれしい。かなりレベルの高いプログラマの面々からいろいろと教えてもらえるので、毎回(ついていけないこともたくさんあるけど)とても勉強になっています。

東北の人に限らず、気が向いたらskypeでポロッと立ち寄ってください。なんなら勉強会自体をジャックしてもらってもかまいませんよー。

私の今日の発表

ナベアツの実装:implicit conversion(暗黙の型変換)の使い方
ymnkさんによる添削版

 class Baka(i:Int){
  def ! = "さぁ~ん!"
 }
 implicit def baka(n:Int) = new Baka(n)

と定義すると、

 println( 3 ! ) // => "さぁ~ん"

となる。

implicit宣言すると、足りないメソッド(ここでは Int.! )が出てきたときに、コンパイル時に挿入できるメソッドを検索して挿入してくれる。

 3.!     // Int.! が足りない!
  ↓
 baka(3).!  // と、コンパイラが補完してくれる。
  ↓
 (new Baka(3)).! //が、実行

この補完方法が分かれば、implicit def の右辺はどんな風にでも組める。ただし何も考えずに多用すると、オブジェクトがポコポコとnewされてしまうので、あんまりクダらない用途では使わない方がいいですね。

こんなネタでも付き合ってくれてありがとうございます!


今日の学び

calc3.scala(h_sakurai)
・Streamの鮮やかな使い方に驚愕した。
・コンパイラってこうやって作るのか!と少しわかった。

TakahashiMethodInScalaSwing.scala(ymnk)
・scala-swing パッケージの概要
・まだAPIとして分かりづらくて、
 結局scala-swing のソースコードリーディングにw
・def title_ = と宣言するとセッターになって、
 title = "あ" と代入文のように書ける。
・コンパイルオプション-Xcheckinitで、初期化されていない
 オブジェクトをチェックできる

Twitterにて、kmizuさんより
・scalac -Xprint:<phase-name>
 で、シンタックスシュガーを展開したソースが見れる。
 <phase-name>は、scalac -Xshow-phasesで


など。第6回まで、もっとたくさん学んだことがありますが、これからはもっと随時書き残していくことにする。


コメント

コメントしてください
お名前:
入力しなければ「匿名さん」。20字以内。

メール:
入力しても表示しません

URL:
入力すればリンクが貼れます


コメント: