方法输出显示两次

时间:2013-11-17 08:19:47

标签: ruby class module

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。然后,也许两者都会被执行。

2 个答案:

答案 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