在Ruby中,foo.inspect可以打印出所有实例变量 - 如果没有访问者,我们可以打印出单个变量吗?

时间:2011-03-22 15:54:25

标签: ruby

通常,我们可以使用p foofoo.inspect来查看实例变量,但它只是默认行为,对象可以选择显示其他内容(或隐藏所有实例变量)(可能)通过重新定义inspect方法。)

主要问题是,如果我可以看到foo.inspect @bar是一个对象,拥有实例变量@wah,其值为"hello",如果@wah@bar没有可用的访问者(阅读器),我可以直接打印@wah吗?通常,如果没有访问者,它应该是不可读的,但是如果用于调试目的呢?

2 个答案:

答案 0 :(得分:6)

在Ruby中,可以使用反射来规避所有访问保护:

@bar.instance_variable_get(:@wah)

答案 1 :(得分:1)

尝试从类外部打印由attr_writer定义的变量将引发错误(undefined method 'wah' for #<Bar:0x0000...>) - 但出于调试目的,您可以使用instance_variable_get

b = Bar.new(:wah => "Hello")
b.wah # undefined method

b.instance_variable_get("@wah") # => "Hello"