添加的实例变量未在Ruby中使用inspect显示

时间:2015-03-24 19:31:43

标签: ruby

Inspect将告诉对象表示。所以我试过了:

animal = "cat"
animal.instance_variable_set(:@a, "dog")
p "inspect object animal: #{animal.inspect}"

但是检查只给了我“猫”,我看不到@ a =“狗”

如果我这样做:

puts "instance variables are: #{animal.instance_variables}"

然后我可以看到[:@a]作为输出

为什么检查不给我一切?

由于

2 个答案:

答案 0 :(得分:2)

String会覆盖#inspectString#inspect)以返回包含在引号中的原始字符串,而不是Object#inspect,它会转储所有内容。

您不应该重新定义String#inspect来说明您的特殊用例。如果您希望您的字符串有一些额外的数据,您应该创建自己的类:

class Animal
  def initialize(name, other)
    @name = name
    @other = other
  end
end

Animal.new("cat", "dog")
# #<Animal:0x007faf9404d828 @name="cat", @other="dog">

答案 1 :(得分:1)

  

为什么检查不给我一切?

不要这样做 - &gt;删除String#inspect方法,看看会发生什么。

class String
  remove_method :inspect
end

animal = "cat"
animal.instance_variable_set(:@a, "dog")
animal # => #<String:0x9976b94 @a=#<String:0x9976b80>>

以上输出是Object#inspect解释的内容 -

  

默认检查显示对象的类名,对象id的编码,实例变量及其值的列表(通过在每个变量上调用inspect)。

但是,在您的情况下,您正在致电String#inspect,这是Object#inspect的重写版本。

  

返回str的可打印版本,由引号括起,并转义特殊字符。

您的输出正是文档提到的内容。

我想在视线中给你一些 。现在不要使用Ruby核心类这样玩,创建自己的自定义类,并尽可能多地使用它们。