1

我正在处理一个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]
4

3 回答 3

2
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.

你总是可以这样做:

def inspect
  self.to_s
end
于 2012-07-19T19:17:30.057 回答
0

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

于 2012-07-19T19:18:59.353 回答
0

books是一个数组,所以调用books.inspect就是调用Array#inspect。该方法通过调用.inspect元素来工作,所以在这种情况下Book#inspect.

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

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

当您希望事情始终如一地工作时,您应该定义inspect并创建to_s别名inspectas is done 在Array类中作为示例。例如

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

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

于 2022-01-27T01:59:21.617 回答