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

Preview:

Citation preview

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

hamamatsu.rb#16 LT 2012/06/13

@suchi

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

おいしい

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

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 電源タップと同じ。電源の取り出し。メソッドチェーンの途中で取り出す。

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変換

[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 から騒ぎ

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

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

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

結論

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

おいしい

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

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

Recommended