假設我們使用的是Rails或者只是ActiveSupport::Dependencies
模塊。現在,讓我們來看看這個代碼:子類的循環依賴
animal.rb
class Animal
CHILD = {
cat: Cat
}
# factory!?
def self.child(name)
CHILD[name].new
end
end
cat.rb
class Cat < Animal
end
dog.rb
class Dog < Animal
end
所有的類加載某處之前:
Cat.new
該代碼將導致B is not a class (TypeError)
(activesupport 3.x)或Circular dependency detected while autoloading constant B
(activesupport 4.x),因爲它尚未創建,但該類的名稱已在類表中。
要解決此問題,可能需要require 'a'
,然後A
需要B
。
可以給我一些更好的解決方案,以解決以下問題嗎?
你能更好地瞭解你打算做什麼嗎?總的來說,我可以想到爲什麼一個班級需要了解自己的子類的幾個原因。 –
循環引用是麻煩的,除非你有一個特定的用例需要它。通常情況下,問題可以通過其他方式解決 - 您需要什麼樣的循環依賴? –
@dsatch,我正在設置在子類中映射哈希CONSTANT和子類。作爲一種解決方案,我可以不斷地使用它的方法,但我認爲這不是一個正確的方法。 –