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

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 

我想从b调用a并引发exception。 我怎么能够?

Ruby没有嵌套类。

inheritance行为的唯一方法是通过inheritance。

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

  • BETA ,引入嵌套类的语言(及其后继者gbeta )
  • 新语

我不知道任何其他的。

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

在上面的例子中,它不是嵌套在A B ,它是嵌套在A中的常量 B 想一想:

 C = A::B 

现在,该类有两个名称: A::BC 显而易见的是, C是全局的而不是嵌套在A 。 (嗯,实际上, C嵌套在Object ,因为它们之间也没有真正的全局常量,但这不是重点。)但是由于CA::B是同一个类,它显然不能同时嵌套而不是嵌套。 唯一合乎逻辑的结论是类本身不是嵌套的。

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

这只是为了lulz:

 class A def a puts "hello from a" end class B def b Module.nesting[1].new.a() end end end 

我通常做这样的事情:

 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 

如果您希望嵌套类扩展外部类,则执行以下操作:

 class Outer class Inner < Outer def use_outer_method outer_method("hi mom!") end end def outer_method(foo) puts foo end end foo = Outer::Inner.new foo.use_outer_method #<= "hi mom" foo.outer_method("hi dad!") #<= "hi dad" 

根据您的具体情况,实际上有一个解决方案,一个非常简单的解决方案。 Ruby允许捕获对象未捕获的方法调用。 所以对于你的例子,你可以这样做:

 def class A def a raise "hi" #can't be reached end class B def initialize() @parent = A.new end def b a() #does find method a. end def method_missing(*args) if @parent.respond_to?(method) @parent.send(*args) else super end end end end 

那么如果你这样做:

 A::B.new().b 

你得到:

 !! # 

它可能是一种更简单的方法来制作像SubController这样的东西,它只处理某些活动,但可以很容易地调用基本的控制器方法(你可能希望在初始化器中将父控制器作为参数发送)。

显然这应该谨慎使用,如果你在整个地方使用它真的会让人感到困惑,但是简化你的代码真的很棒。

应该是A类的类方法吗?

 class A def self.a raise "hi" end class B def b A::a end end end A::B.new.b 

如果你想把它作为一个实例方法,你显然会在一个实例上调用它,例如A.new.a