method output is displayed twice
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 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中的这段代码的结果是:
号
(两次,如你所见)?另外,为什么取消对class D定义中的行的注释会使"M"也出现两次?
这是关于在从另一个具有方法x的类继承的类中调用方法x,并混合在一个也包含方法x的模块中。
我可以猜测,第二种情况下"M"的双重显示是由于调用d.meth的原因:meth在D的超类中,也在module中,D包含,所以模块方法方法可能会覆盖class C的方法meth。然后,也许两个都被处决了。
类C中的meth方法将按当前的状态打印值"C",然后,由于您在调用p d.meth时在末尾使用另一个p语句,因此将再次打印值"C"。净影响是2次打印调用,导致2"C"语句的输出。
为了避免这种情况,就这么做吧
需要注意的是,Ruby中的每个方法都返回一个值,所以这就是"C"第二次可用于打印的方式。
Every method in Ruby returns a value by default. This returned value will be the value of the last statement.
号
在使用include M的情况下也是如此,M模块中方法meth的定义已经有了一个打印语句,返回值再次打印。
至于你的猜测,不,你错了——这不会发生,因为方法被调用了两次。Ruby用模块的meth方法覆盖了从"c"继承的早期meth方法。有关Ruby中方法重载的更多信息,请检查此项。
- Ruby默认不返回值。这是所有方法的作用,据我所知,你不能改变它。所以它不是"默认"的,它只是Ruby方法的一个特征。
- @vgoff文本引用自我刚才使用的链接。至于by default statement,我认为它比较了其他语言(如python、c等)如何需要显式的返回语句,而不像ruby,这可能不是ruby的新用户所期望的。
- @vgoff-fwiw,当我还是Ruby初学者时,看到返回值没有返回语句而被使用时,我自己也感到非常困惑。
- 这很好,只是默认值带有一些权重,在给定的条件下,它将被改变。至少当我看到"默认"这个词的时候。如果您在学习Ruby时被告知它不是默认的,它只是一个方法的特征,那么可能不会有混淆。这是我第一次听说鲁比的事。
- @vgoff我自己已经学到了很多东西,而且由于我已经有了C/python的编程背景,所以我天真地认为返回是必要的:)
第一个"C"由C#meth打印。
第二个由p d.meth打印,p"C"的返回值为"C",返回给meth的调用方。
如果没有p,只调用d.meth一次。