簡體   English   中英

為什么在嘗試在Ruby中引用嵌套類時出現錯誤?

[英]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::ClassEObject 首次打開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

一些相關的問題:

  1. Ruby是否提供類A :: B :: C的名稱空間路徑,例如[:A,:B]?
  2. 如果我在Ruby Object類中定義了類方法,如何獲得調用此方法的子類的名稱?
  3. 如何從Ruby中的字符串“ A :: B :: C”獲取類對象?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM