Ruby 方法输出显示两次

Ruby 方法输出显示两次,ruby,class,module,Ruby,Class,Module,(两次,如您所见)? 另外,为什么在类D定义中取消对行的注释会导致出现“M”,也会出现两次 这是关于在一个类中调用方法x,该类使用方法x从另一个类继承,并混合在一个也包含方法x的模块中 我可以猜测在第二种情况下,双重显示“M”是由于调用d.meth:meth可以在d的超类中找到,也可以在d包含的模块中找到,因此,模块方法meth可能会覆盖类C的方法meth。然后,可能两个都被执行。第一个“C”由C#meth打印 第二种是通过pd.meth打印的;p“C”的返回值是“C”,返回给meth的调用者

两次,如您所见)? 另外,为什么在
类D
定义中取消对行的注释会导致
出现“M”
,也会出现两次

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

我可以猜测在第二种情况下,双重显示
“M”
是由于调用
d.meth
meth
可以在
d
的超类中找到,也可以在
d
包含的
模块中找到,因此,模块方法meth可能会覆盖
类C
的方法
meth
。然后,可能两个都被执行。

第一个
“C”
C#meth
打印

第二种是通过
pd.meth
打印的;
p“C”
的返回值是
“C”
,返回给
meth的调用者


只调用
d.meth
而不调用
p
将只打印一次。

C
中的
meth
方法将按当前状态打印值
“C”
,接下来,由于您在调用
p d.meth
时在末尾使用另一个
p
语句,因此值
“C”
将再次打印。净效果是进行了2次打印调用,导致输出2条
“C”
语句

要避免这种情况,只需这样做

"C" 
"C"
需要注意的是,
“C”
就是这样第二次打印的

默认情况下,Ruby中的每个方法都返回一个值。此返回值将是最后一条语句的值

当您使用
include M
时,模块
M
中方法
meth
的定义中已经有一个print语句,返回值将再次打印

至于你的猜测,不,你错了——这不会发生,因为这个方法被调用了两次。
Ruby用模块的
meth
方法覆盖从“C”继承的早期
meth
方法。查看有关ruby中方法重载的详细信息。

ruby默认情况下不返回值。这是所有方法所做的,据我所知,你无法改变这一点。所以它不是“默认值”,它只是Ruby方法的一个特征。@vgoff文本引用了我刚才在上面使用的链接。至于默认情况下的
语句
,我认为这是一个比较,其他语言如python、C等如何需要一个与ruby不同的显式返回语句,这可能不是ruby新手所期望的。@vgoff FWIW,当我还是ruby的初学者时,当我看到返回值在没有返回语句的情况下被使用时,我自己也感到非常困惑。这很好,只是默认值带有一些权重,它意味着在某些条件下要改变。至少当我看到“默认”这个词时。如果您在学习Ruby时被告知它不是默认值,它只是一个方法的特征,那么可能不会有任何混淆。这是关于Ruby的第一件事。@vgoff我自己已经学会了很多,而且因为我已经有了C/Python编程背景,我天真地认为返回是必要的:)
"C" 
"C"
d = D.new
d.meth