如何从字符串插值语法的类to_s方法获得不同的行为?

时间:2017-03-24 10:02:29

标签: ruby class methods

我编写了一个类似于另一个类的数组的类。我有一个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获取来电者标签,但这似乎远非最佳状态。对相关文档的任何帮助或指示都将非常感激,我还未能找到有关该主题的任何内容。谢谢!

1 个答案:

答案 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