嵌套类如何在Ruby中访问外部类中的方法?

nes*_*983 20 ruby macruby

def class A
  def a
    raise "hi" #can't be reached
  end

  class B
    def b
      a() #doesn't find method a.
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想调用from b并引发异常.我怎么能够?

Jör*_*tag 26

Ruby没有嵌套类.

继承行为的唯一方法是通过继承.

如果希望代码工作,则需要使用支持嵌套类的语言.虽然这是一个令人难以置信的整洁和强大的功能,但遗憾的是我只知道两种具有嵌套类的语言:

我不知道任何其他的.

Java有一个名为嵌套类的构造,但它们有一些不幸的设计限制.

在你上面的例子,它不是B是内嵌套A,它是不断 B被里面嵌套A.想一想:

C = A::B
Run Code Online (Sandbox Code Playgroud)

现在,该课程有两个名称:A::BC.应该立即显而易见的C是全局而不是嵌套在内部A.(嗯,实际上,C嵌套在里面Object,因为也没有真正的全局常量,但这不是重点.)但是因为C并且A::B是同一个类,它显然不能同时嵌套而不是嵌套.唯一合乎逻辑的结论是类本身不是嵌套的.

嵌套类的定义特征是方法查找沿着两个维度:向上继承链,向外通过嵌套.Ruby,就像所有OO语言的99.9%一样,只支持前者.(在某种意义上,嵌套类不仅继承了它们超类的特性,还继承了它们周围类的特性.)

  • @Michael Kohl:那些不是嵌套类,那些是命名空间常量.第一句话是正确的.我想要发生的是,第二句最初读的是"嵌套常量引用类",他们认为它听起来有点强迫,所以他们把它缩短为"嵌套类"而没有意识到他们的错误.有点像每个人都知道Ruby没有类方法,但我们仍然称它们为"类方法",因为正确的表达"类对象的单例类的实例方法"是非常不方便的.不幸的是,这个 (2认同)

hor*_*guy 11

这只是为了lulz:

class A
  def a
    puts "hello from a"
  end

  class B
    def b
      Module.nesting[1].new.a()
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


小智 5

我通常做这样的事情:

class A
  def a
    puts "hi"
  end

  def createB
    B.new self
  end

  class B
    def initialize(parent)
      @parent=parent
    end

    def b
      @parent.a
    end
  end
end

A.new.createB.b
Run Code Online (Sandbox Code Playgroud)