彼らのキーワードのような振る舞いについて何かを付け加えたいと思います。なぜなら、答えは方法よりも場所に関するものだったからです。その答えは、Rubyの複雑なメタプログラミング機能にあります。フックを利用してキーワードとして使用することができます。Rubyのフックは、特定のイベント(つまりフックの名前)が発生したときに呼び出される関数です。重要なのは、フックが引数として定義されたメソッドの名前を受け取ることです。このようにして、フックの動作を変更することができます。method_added
method_added
たとえば、このフックを使用して、Pythonのデコレータと同様の動作を定義できます。private
重要な部分は、 andメソッドとは異なりprotected
、このデコレータのようなメソッドは、method_added
それ自体を定義しないaを定義する必要があるということです。
class Module
def simple_decorator
eigenclass = class << self; self; end
eigenclass.class_eval do
define_method :method_added do |name|
eigenclass.class_eval { remove_method :method_added }
old_name = 'old_' + name.to_s
alias_method old_name, name
class_eval %Q{
def #{name}(*args, &block)
p 'Do something before call...'
#{old_name}(*args, &block)
p '... and something after call.'
end
}
end
end
end
end
class UsefulClass
simple_decorator
def print_something
p "I'm a decorated method :)"
end
def print_something_else
p "I'm not decorated :("
end
end
a = UsefulClass.new
a.print_something
a.print_something_else
simple_decorator
言語キーワードのように見え、private
;のように動作します。ただし、method_added
フックが削除されるため、直後のメソッド定義にのみ適用されます。