受此article的啓發,我在玩Ruby方法調用層次結構並注意到一些奇怪的事情。Ruby方法調用層次結構
考慮:
class B
def foo
"- Instance method defined by B"
end
def method_missing(method)
puts "- method_missing (#{method}) on b. Redirecting to b.foo\n"
foo
end
end
b = B.new
def b.foo
"- Method defined directly on an instance of B\n" + super
end
def b.method_missing(method)
"- method_missing (#{method}) on b. Calling super\n" + super
end
puts "Calling 'bar' on b of type #{b.class}:"
puts b.bar
運行它給:
Calling 'bar' on b of type B:
- method_missing (bar) on b. Redeirecting to b.foo
- method_missing (bar) on b. Calling super
- Method defined directly on an instance of B
- instance method defined by B
我的問題是:
由於我打電話b.bar(在對象上),怎麼來的類的實例方法在調用objet的實例方法之前調用?
我本來期望b.method_missing(method)
首先被調用,然後類的實例method_missing(method)
(因爲我調用超?但超是類層次結構...),其中不重定向從bar
到foo
。 另外,爲什麼在重定向到foo
之後,實例的missing_method被調用?我們被告知我們正在重定向...
我想我不明白Ruby如何允許在一個類的實例(新對我)中定義實例方法的概念,而不是將其定義爲類的實例方法(經典語言)。
我希望這個問題是有道理的,也許我的頭仍然是從昨晚紡...
我的返回值一起輸出在
b.method_missing
字符串看到的第一線刪除不相關的代碼,使問題更加明顯。提供一個* minimal *問題的例子通常是一個好主意。 – 2012-01-02 00:11:21