我编写了一个类似于另一个类的数组的类。我有一个to_s方法,当使用如下时以类似的方式返回数组:
array = [1, 2, 3, 4]
puts array
这导致输出:
1
2
3
4
与字符串插值puts "#{array}"
一起使用时,输出不同:
[1, 2, 3, 4]
如何在我的类中实现to_s方法,以便在字符串插值中不使用时提供多行输出,在字符串插值时使用单行输出?
我考虑过尝试使用caller_locations(1,1)[0].label
获取来电者标签,但这似乎远非最佳状态。对相关文档的任何帮助或指示都将非常感激,我还未能找到有关该主题的任何内容。谢谢!
答案 0 :(得分:3)
Array#to_s
不会(也不应该)检查它所调用的上下文。数组的打印方式不同,因为puts
检查给定的参数是否是一个数组(或者可以转换为一个数组)数组)。来自documentation:
如果使用数组参数调用,则将每个元素写入新行。
您可以提供to_ary
方法:
class MyArray
def to_s
[1, 2, 3].join('-')
end
def to_ary
[1, 2, 3]
end
end
a = MyArray.new
puts a # calls to_ary and then prints each item on a separate line
# 1
# 2
# 3
puts a.to_s # just prints the result of to_s
# 1-2-3
puts "#{a}" # same as above
# 1-2-3