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::B和C.应该立即显而易见的C是全局而不是嵌套在内部A.(嗯,实际上,C嵌套在里面Object,因为也没有真正的全局常量,但这不是重点.)但是因为C并且A::B是同一个类,它显然不能同时嵌套而不是嵌套.唯一合乎逻辑的结论是类本身不是嵌套的.
嵌套类的定义特征是方法查找沿着两个维度:向上继承链,向外通过嵌套.Ruby,就像所有OO语言的99.9%一样,只支持前者.(在某种意义上,嵌套类不仅继承了它们超类的特性,还继承了它们周围类的特性.)
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)