rubyでそれっぽいdecorator
pythonのdecoratorかっこいいなあとか。rubyでも欲しい。普通にrubyッぽくやるなら多分privateとかのようにシンボル与えてそれを繋ぐように書くんだろうけど、pythonっぽく前置したいなあとか。こないだmethod_addedとか覚えたのでそれ使ってみようと。とかしてて、全然内部が理解できてないことに気がついた。
こんなん
class Object @@guard = true @@method = nil def decorator(mth) mth = method(mth) if mth.class == Symbol @@method = mth @@guard = false end def self.method_added(name) if @@guard; return else @@guard = true end ret = @@method.call(method(name)) define_method name, ret end end
んーー。Objectにつけちゃっていいんだろうかとか、guardしないとdefine_methodでまたaddedが呼ばれて無限ループになってしまうのでつけたんだけど、んーーー汚い。更にThread unsafeなり。ダメダメ。んーー。どないすれば。
一応
動く。
#!/usr/bin/env ruby require 'decorator' def hello(m, *args) proc { print "hello " m.call() } end decorator :hello def foo puts "foo" end decorator proc { |m, *args| proc { print "bye " m.call() } } def bar puts "bar" end def baz puts "baz" end foo bar baz
tkuro@sawshark> ruby -I. dctest.rb
hello foo
bye bar
baz
結論
RHG読み直そう。。。