0
我不能找出對象如何來很聰明無視即使首次執行下面的代碼塊。對象的方法查找路徑(模塊&方法重寫)
它正在搜索的方法是在每個模塊上
class A
include B,C,D,B
end
紅寶石是否保持在側模塊名稱的數組(因爲它顯然要D
)?
我不能找出對象如何來很聰明無視即使首次執行下面的代碼塊。對象的方法查找路徑(模塊&方法重寫)
它正在搜索的方法是在每個模塊上
class A
include B,C,D,B
end
紅寶石是否保持在側模塊名稱的數組(因爲它顯然要D
)?
我不是100%我明白你的問題,但我盡力......
紅寶石實際上記住哪些模塊被納入一類和這些模塊合併成方法查找路徑。您可以使用A.included_modules
方法我從包含的模塊被放置在當前類中定義的模塊的頂部問一個類的方法包括。請看這個例子:
class X
def foo
puts 'Hi from X'
end
end
module AnotherFoo
def foo
puts "Hi from AnotherFoo"
super
end
end
class Y < X
include AnotherFoo
end
y = Y.new
y.foo
# Hi from another foo
# Hi from X
class Y < X
include AnotherFoo
def foo
puts "Hi from Y"
super
end
end
y.foo
# Hi from Y
# Hi from another foo
# Hi from X
你可以看到方法的解析順序:子類 - >包含模塊 - >父類。你也可以看到模塊總是隻包含一次。所以如果一個課程已經包含一個模塊,它將不會再被重新包含。
A.included_modules?爲我工作的足夠好,足以告訴我,ruby保留了一組模塊名稱,並且我猜測它在這裏所做的第一件事是通過該數組的所有元素,並查看是否有錯誤。謝謝! – 2012-01-16 00:25:14
你是什麼意思「如果有問題」? Ruby有一個明確的方法解析順序。意思是當提到它的名字時,它用來找到你正在調用的實際函數的算法。正如我所說,順序是類 - >包含模塊(按順序嘗試) - >父類。如果其中一個包含具有已定義名稱的方法,則會使用它並且中止搜索。 – 2012-01-16 00:30:02
事實上,說的東西可能出問題我沒有提的是,什麼是錯的,我只是說,顯然,當我們去詢問一個模塊的時刻,如果響應某種形式的消息,什麼紅寶石確實是問自己included_modules,然後按照之前的說法做一些事情'一個包含的模塊不會被重新引入'現在,我理解了關於方法查找路徑的另一部分,但我知道它是如何工作的,因爲它非常簡單。這只是我把所有這些模塊中聲明 – 2012-01-16 00:40:51