我使用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的。
从Ruby编程语言:
替代文字http://ecx.images-amazon.com/images/I/41n-JSlBHkL._SL75_.jpg
输出流追加,比如字符串和数组,你可以用值写入其中<<
运营商。 puts
是最常见的输出方式之一。 它每个参数转换为字符串,并写入每一个流中。 如果字符串不已经与一个换行符结尾,它增加了一个。 如果任一参数以卖出期权是一个阵列,所述阵列被递归扩展,并且每个元件被印刷在其自己的线路,如果它直接作为参数传递给期权。 该print
方法将其参数转换为字符串,并将其输出到流。 如果全球现场分离器$
,已经从它的默认值改为nil
,则该值是每个参数之间的输出print
。 如果输出记录分隔符$/
已从其默认值改为nil
,则该值是打印所有参数后输出。
至于设计决策,我不知道。
哦,孩子......这已经在ruby-talk上的邮件列表,在ruby-core邮件列表和博客的一个极大无尽线程无数的话题。
它的要点是puts
特殊情况下Array
秒。 为什么特殊情况下的,为什么它的特殊情况下, 只有那些(而不是,比方说,所有Enumerable
S),为什么它的特殊情况下,这些(而不是,说, print
),没有人真正知道。 这是它的方式。
顺便说一句,既然你提到了POLS:Ruby社区一直说得很清楚了POLS 仅适用于马茨。 因此,Ruby是大概也就不足为奇了马茨。 如果你或者我或者其他人惊讶的是,这不计数。