ruby Array.inspect vs. Array[element].to_s



我正在使用一个数组,我们称之为books,复杂对象,我们称之为Book。问题是当我调用puts "#{books.inspect}"时,ruby 输出二进制流(不可读的 utf8 字符(。但是,当我打电话给puts #{books[0].to_str}"时,我得到了一个简短、漂亮的输出,描述了所讨论book。不确定它是否相关,但Book是一个子类(我们可以称它为父类 Item (,并且books.length=1

Ruby 暗示.to_s.inspect是同义词,但它们在实践中显然提供了不同的结果。有谁知道为什么会发生这种情况,您能否提供有关如何从整个书籍收藏中获得我想要的漂亮输出的建议?

杂项信息:

[chk ~ ]$ ruby -v
ruby 1.9.2p290 (2011-07-09 revision 32553) [x86_64-linux]
class Myclass
    def to_s
        'my string representation'
    end
    def inspect
        'my inspection'
    end
end
a= [Myclass.new]
p a
puts a
outputs ::
[my inspection]
my string representation

为数组中的每个元素调用 inspect 方法。如果未定义该方法,则获得默认类表示形式。您只需要定义 inspect .

你总是可以只做:

def inspect
  self.to_s
end

books.inspectbooks[0].to_s绝对不一样。第一个是对book对象(数组(inspect方法的调用。第二个是对books[0]对象to_s方法的调用,无论数组中包含的是什么。由于你没有具体说明books[0]到底是什么,恐怕我不能再说什么了。

books是一个

数组,所以调用books.inspect就是调用Array#inspect。该方法的工作原理是对元素调用.inspect,因此在本例中Book#inspect .

执行字符串插值"Here's some info #{value}"调用value对象.to_s无论其类是什么。

将它们放在一起作为示例"Books #{books}"将调用调用Book#inspect以生成输出字符串的Array#to_s(这是Array#inspect的别名(。

当你希望事情一致地工作时,你应该定义inspectto_s inspect的别名,就像在Array类中所做的那样。

class MyClass
  def inspect
    'my string representation'
  end
  alias_method :to_s, :inspect
end

有时,您可能希望它们有所不同,其中.inspect对调试很有用,而.to_s对于更常见的输出很有用。在这种情况下,您将使用不同的代码定义它们中的每一个。

最新更新