可以一个`检查`而不获取上下文?

时间:2014-10-17 04:14:52

标签: ruby inspect

我认为inspect会转储对象的内容,但是我得到的远远超过了解要包含的对象。我在do ... end块内倾倒了。是否有另一种类似于inspect的方法,它只提供对象包含的内容,或者一个inspect如何没有上下文?

3 个答案:

答案 0 :(得分:0)

inspect应该打印对象的人类可读表示。它通常用于跟踪语句中。默认情况下,它将打印对象的类,对象ID和与其值相关联的实例变量。因此,它允许您快速确定对象的类型,标识和属性。

还要考虑to_s方法,该方法应该将对象转换为字符串;它通常只使用对象的属性组成一个新的字符串表示;它可能会也可能不会全部使用它们。

这两种方法都不会考虑其接收器。

答案 1 :(得分:0)

Object#inspect不是转储对象内容的方法,它只是对象的字符串表示,意味着人类可读。

单个类或对象可能会覆盖此方法的行为以返回所需的任何字符串。默认行为是显示类名,对象ID和任何实例变量(通过在每个变量上调用#inspect将其转换为字符串)。这种递归级别,其中实例变量也是#inspect,这可能是您看到比预期更多“上下文”的原因。

如果您正在寻找将对象内容转储为字符串的方法,以便可以从该字符串重新创建它,您应该查看Marshalstr = Marshal.dump(obj)尝试将对象的内容转储为字符串,而obj = Marshal.load(str)将字符串转换回对象。

另一个选项,取决于对象的类型,是使用JSONYAML序列化它们。

答案 2 :(得分:0)

如其他答案中所述,inspect用于通过转储对象的所有内容(obj的人类可读表示)进行调试。

我认为您可能会发现to_yaml在您的案例中更有用:

object.to_yaml
# #=> --- !ruby/object:ObjectType
# attr1 => value
# attr2 => value
# ... etc

提示:

我还发现在puts提供更可读的控制台输出之前添加to_yaml

puts object.to_yaml