我想補充一些有關自己關鍵字樣行爲,因爲答案已經比較瞭解其中比如何;答案在於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 *)很好奇。 –