红宝石阵#使不使用重写的实现?(Ruby Array#puts not using overridd

2019-10-18 22:07发布

我使用Ruby 1.8.6以下代码:

# Create an array and override the #to_s on that object
thing = [1,2,3]
def thing.to_s
  'one'
end

print "Using print: "
print thing

puts
puts "Using puts: "
puts thing

输出:

Using print: one
Using puts: 
1
2
3

所以事情是一个数组 ,我已重写的事情 #to_s。 打印似乎用我的被覆盖的实现,而看跌期权则没有。 为什么?

我按照内核#puts和内核#打印(这是C-实现)的源代码,看看他们是非常不同的实现。 我想知道什么可能是设计决定(如果有的话),这背后?

顺便说一句,如果我创建东西另一个类,我写的一个实例(或作为哈希/字符串/其他类我试过),印刷和看跌期权使用重写实现to_s的。

Answer 1:

从Ruby编程语言:
替代文字http://ecx.images-amazon.com/images/I/41n-JSlBHkL._SL75_.jpg

输出流追加,比如字符串和数组,你可以用值写入其中<<运营商。 puts是最常见的输出方式之一。 它每个参数转换为字符串,并写入每一个流中。 如果字符串不已经与一个换行符结尾,它增加了一个。 如果任一参数以卖出期权是一个阵列,所述阵列被递归扩展,并且每个元件被印刷在其自己的线路,如果它直接作为参数传递给期权。 该print方法将其参数转换为字符串,并将其输出到流。 如果全球现场分离器$ ,已经从它的默认值改为nil ,则该值是每个参数之间的输出print 。 如果输出记录分隔符$/已从其默认值改为nil ,则该值是打印所有参数后输出。

至于设计决策,我不知道。



Answer 2:

哦,孩子......这已经在ruby-talk上的邮件列表,在ruby-core邮件列表和博客的一个极大无尽线程无数的话题。

它的要点是puts特殊情况下Array秒。 为什么特殊情况下的,为什么它的特殊情况下, 只有那些(而不是,比方说,所有Enumerable S),为什么的特殊情况下,这些(而不是,说, print ),没有人真正知道。 这是它的方式。

顺便说一句,既然你提到了POLS:Ruby社区一直说得很清楚了POLS 适用于马茨。 因此,Ruby是大概也就不足为奇了马茨。 如果你或者我或者其他人惊讶的是,这不计数。



文章来源: Ruby Array#puts not using overridden implementation?
标签: ruby ruby-1.8