我想补充一些有关自己关键字样行为,因为答案已经比较了解其中比如何;答案在于Ruby的复杂元编程功能。 有可能使用它们作为关键字使用method_added
钩子; Ruby中的一个钩子是一个在特定事件(即钩子名称)发生时被调用的函数。 重要的是,method_added
挂钩接收已定义方法的名称作为其参数:这样,可以修改它的行为。例如,你可以使用这个钩子来定义类似于Python的装饰器的行为;重要的部分是,不同于private
和protected
方法,这个装饰类的方法应该定义一个method_added
即取消定义本身:
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
钩子,它仅适用于紧随其后的方法定义。
你看过http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Classes#Private? – jtbandes
是的,但是这并没有说明方法在哪里或如何实际执行。我完全知道什么是'private'&'protected',我对Ruby的内部(* how *&* where *)很好奇。 –