Inspect将告诉对象表示。所以我试过了:
animal = "cat"
animal.instance_variable_set(:@a, "dog")
p "inspect object animal: #{animal.inspect}"
但是检查只给了我“猫”,我看不到@ a =“狗”
如果我这样做:
puts "instance variables are: #{animal.instance_variables}"
然后我可以看到[:@a]作为输出
为什么检查不给我一切?
由于
答案 0 :(得分:2)
String
会覆盖#inspect
(String#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核心类这样玩,创建自己的自定义类,并尽可能多地使用它们。