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

15
メタプログラミングRubyは この付録が美味しい (読書会落ち穂拾い) hamamatsu.rb#16 LT 2012/06/13 @suchi

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

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

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

hamamatsu.rb#16 LT 2012/06/13

@suchi

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

湖池屋の ジャガッツは このギザギザが

おいしい

http://www.youtube.com/watch?v=r1Pr8x-0ZNU

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

付録A よく使うイディオム

メタではないイディオム

• A.1 ミミックメソッド

• A.2 nilガード

• A.3 メソッド引数

• A.4 自己yield

• A.5 Symbol#to_proc()

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

A.4 自己yield

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

例: tap 電源タップと同じ。電源の取り出し。メソッドチェーンの途中で取り出す。

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

A.5 Symbol#to_proc()

class Symbol def to_proc Proc.new {|x| x.send(self)} end end [1,2,5].inject(0, &:+) #=> 8

シンボルのProc変換

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

[1,2,5].inject(0, &:+) #=> 8

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

涙目

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

涙目で読む

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

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

付録B ドメイン特化言語

• DSL: ドメイン特化言語

– (Domain Specific Language)

• GPL: 汎用言語

– (General Purpose Language)

• 内部DSL:

– GPL内に存在するDSL

• 外部DSL:

– 独自のパーザ。書かれた言語と無関係

• →Rubyはメタプログラミングが得意なので内部DSLも得意ですよ

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

付録C 魔術書

• これまで出てきたメタプログラミングのイディオムカタログ

• あたかも優等生がまとめてくれたノートのように

• 復習に最適

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

付録D 参考書

ふつう

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

付録E から騒ぎ

@obj = double.as_null_object @obj.foo @obj.bar @obj.baz

日本語版のみのスペシャルセクション! NullObjectパターンの解説 RSpecのas_null_objectでもおなじみ

全部ブラックホールのように受け止めてくれるにくい奴

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

結論

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

湖池屋の ジャガッツは このギザギザが

おいしい

http://www.youtube.com/watch?v=r1Pr8x-0ZNU

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

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