メタプログラミングRubyはこの付録が美味しい
-
Upload
shigeru-uchiyama -
Category
Documents
-
view
6.946 -
download
7
Transcript of メタプログラミングRubyはこの付録が美味しい
メタプログラミング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は この付録も美味しい