我正在使用一个数组,我们称之为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.inspect
和books[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
的别名(。
当你希望事情一致地工作时,你应该定义inspect
并to_s
inspect
的别名,就像在Array
类中所做的那样。
class MyClass
def inspect
'my string representation'
end
alias_method :to_s, :inspect
end
有时,您可能希望它们有所不同,其中.inspect
对调试很有用,而.to_s
对于更常见的输出很有用。在这种情况下,您将使用不同的代码定义它们中的每一个。