通常,我们可以使用p foo
或foo.inspect
来查看实例变量,但它只是默认行为,对象可以选择显示其他内容(或隐藏所有实例变量)(可能)通过重新定义inspect
方法。)
主要问题是,如果我可以看到foo.inspect
@bar
是一个对象,拥有实例变量@wah
,其值为"hello"
,如果@wah
和@bar
没有可用的访问者(阅读器),我可以直接打印@wah
吗?通常,如果没有访问者,它应该是不可读的,但是如果用于调试目的呢?
答案 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"