关于ruby:方法输出显示两次

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中的这段代码的结果是:

1
2
"C"
"C"

(两次,如你所见)?另外,为什么取消对class D定义中的行的注释会使"M"也出现两次?

这是关于在从另一个具有方法x的类继承的类中调用方法x,并混合在一个也包含方法x的模块中。

我可以猜测,第二种情况下"M"的双重显示是由于调用d.meth的原因:methD的超类中,也在module中,D包含,所以模块方法方法可能会覆盖class C的方法meth。然后,也许两个都被处决了。


C中的meth方法将按当前的状态打印值"C",然后,由于您在调用p d.meth时在末尾使用另一个p语句,因此将再次打印值"C"。净影响是2次打印调用,导致2"C"语句的输出。

为了避免这种情况,就这么做吧

1
2
d = D.new
d.meth

需要注意的是,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中方法重载的更多信息,请检查此项。


第一个"C"C#meth打印。

第二个由p d.meth打印,p"C"的返回值为"C",返回给meth的调用方。

如果没有p,只调用d.meth一次。