[英]Why do I get an error trying to refer a nested class in Ruby?
為什么下面的示例有錯誤?
class ClassA
class ClassB
end
class ClassC
def test
ClassB.new
end
end
end
p ClassA::ClassC.new.test # => #<ClassA::ClassB:0x0000010103f860>
class ClassA
class ClassD
def test
ClassB.new
end
end
end
p ClassA::ClassD.new.test # => #<ClassA::ClassB:0x0000010103f010>
class ClassA::ClassE
def test
ClassB.new
end
end
p ClassA::ClassE.new.test # => NameError: uninitialized constant ClassA::ClassE::ClassB
還有另一種創建ClassE
,而不是通過鍵入class ClassA; class ClassE
class ClassA; class ClassE
?
好吧,是的,如果您定義測試方法以返回ClassA::ClassB.new
:-)
您也可以使用const_missing
以便它調用ClassA.const_get
。
否則, ClassB
不在當前范圍內,此時,它只是ClassA::ClassE
和Object
。 首次打開ClassA
,然后打開ClassE
,首先在ClassA::ClassE
進行查找,然后在ClassA
(找到該位置)中進行ClassB
的查找,然后在Object
查找。
然后,由Marc-AndréLafortune建議的自定義Object#const_missing
方法將是
def Object.const_missing(name)
@looked_for ||= {}
key = self.to_s + '~' + name.to_s
raise "Class not found: #{name}" if @looked_for[key] == key
return @looked_for[key] if @looked_for[key]
@looked_for[key] = key
if self.to_s.include? '::'
klass = Object
self.to_s.split('::')[0..-2].each do |klass_string|
klass = klass.const_get klass_string
end
return @looked_for[key] = klass.const_get(name) if klass # klass.is_a?(Class)
end
raise "Class not found: #{name}"
end
一些相關的問題:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.