我将 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。print似乎使用了我的覆盖实现,而puts没有。为什么?
我遵循了 Kernel#puts 和 Kernel#print (它们是 C 实现)的源代码,发现它们是非常不同的实现。我想知道这背后的设计决策(如果有的话)是什么?
顺便说一句,如果我将事物创建为我编写的另一个类的实例(或作为我尝试过的哈希/字符串/其他类),则 print 和 puts 都使用 to_s 的重写实现。