メタプログラミングRubyは
    この付録が美味しい
    (読書会落ち穂拾い)


                  @suchi

        hamamatsu.rb#16 LT
               2012/06/13
湖池屋の
   ジャガッツは
   このギザギザが
    おいしい
http://www.youtube.com/watch?v=r1Pr8x-0ZNU
付録A よく使うイディオム
メタではないイディオム

•   A.1   ミミックメソッド
•   A.2   nilガード
•   A.3   メソッド引数
•   A.4   自己yield
•   A.5   Symbol#to_proc()
A.4 自己yield
例: tap 電源タップと同じ。電源の取り出し。メソッドチェーン
の途中で取り出す。

class Object
 def tap
  yield self
  self
 end
end

%w(a b c).push('d').shift.upcase.next
%w(a b c).push('d').tap{|x|puts x}.shift.upcase.next
A.5 Symbol#to_proc()
シンボルのProc変換

class Symbol
 def to_proc
  Proc.new {|x| x.send(self)}
 end
end

[1,2,5].inject(0, &:+) #=> 8
[1,2,5].inject(0, &:+)
#=> 8
涙目
涙目で読む
1.   Symbolのto_procはProcを返す(1.9ではデフォルト)
2.   そのProcは1つめの引数をレシーバとして、シンボル名のメソッ
     ドに残りの引数を渡して呼び出す
3.   シンボルに&をつけると、Procとして扱われる(内部でto_proc
     が呼び出してくれる)
4.   InjectはそのProcに一つ前の返値と新しい要素の二つを渡す。
5.   Injectの最初の引数(0)は最初の要素の第一引数にが使われる
6.   たとえば最初は :+.to_proc.call(0, 1) が呼ばれるので0.+(1)が
     呼ばれる。以下ループ
7.   つまり[1,2,3].inject(0,&:+)は、
     ・:+.to_proc.call(:+.to_proc.call(:+.to_proc.call(0,1), 2), 3)
     同じことになる
     #=>8
付録B ドメイン特化言語
• DSL: ドメイン特化言語
 – (Domain Specific Language)
• GPL: 汎用言語
 – (General Purpose Language)
• 内部DSL:
 – GPL内に存在するDSL
• 外部DSL:
 – 独自のパーザ。書かれた言語と無関係
• →Rubyはメタプログラミングが得意なので内
  部DSLも得意ですよ
付録C 魔術書

• これまで出てきたメタプログ
  ラミングのイディオムカタロ
  グ
• あたかも優等生がまとめてく
  れたノートのように
• 復習に最適
付録D 参考書




ふつう
付録E から騒ぎ
日本語版のみのスペシャルセクション!
NullObjectパターンの解説
RSpecのas_null_objectでもおなじみ

@obj = double.as_null_object

@obj.foo
@obj.bar
@obj.baz

全部ブラックホールのように受け止めてくれるにくい奴
結論
湖池屋の
   ジャガッツは
   このギザギザが
    おいしい
http://www.youtube.com/watch?v=r1Pr8x-0ZNU
メタプログラミングRubyは
    この付録も美味しい

メタプログラミングRubyはこの付録が美味しい