module M
def meth
p "M"
end
end
class C
def meth
p "C"
end
end
class D < C
#include M
end
d = D.new
p d.meth
嗨,您能解释为什么Ruby中此代码的结果是:
"C"
"C"
( TWICE ,如您所见)?
另外,为什么取消注释class D
定义中的行会导致"M"
,还会 TWICE ?
这是关于在一个类中调用方法x,该类从方法x继承另一个类并混合在一个也包含方法x的模块中。
我可以猜测第二种情况下"M"
的双重显示是对d.meth
的调用所欠的:meth
位于{D
的超类中1}}以及module
包含的D
,也许模块方法可能会覆盖class C
的方法meth
。然后,也许两者都会被执行。
答案 0 :(得分:3)
第一个"C"
由C#meth
打印。
第二个由p d.meth
打印; p "C"
的返回值为"C"
,返回给meth
的调用者。
在没有d.meth
的情况下拨打p
只会打印一次。
答案 1 :(得分:3)
类meth
中的C
方法将打印当前的值"C"
,接下来,因为您在结束时使用了另一个p
语句致电p d.meth
,再次打印值"C"
。净效果是进行了2次打印调用,导致输出2 "C"
个语句。
为避免这种情况,请执行
d = D.new
d.meth
需要注意的是every method in ruby returns a value,因此"C"
可以第二次打印。
Ruby中的每个方法都默认返回一个值。此返回值将是最后一个语句的值。
使用include M
的情况也是如此,模块meth
中方法M
的定义已经有了一个print语句,并且再次打印了返回值。< / p>
至于你的猜测,不是你错了 - 它不会发生,因为该方法被调用两次。
Ruby使用模块的meth
方法覆盖从“C”继承的早期meth
方法。有关ruby中方法重载的更多信息,请查看this。