2011-03-22 54 views
4

通常,我們可以使用p foofoo.inspect來查看實例變量,但是它只是默認行爲,對象可以選擇顯示其他內容(或者隱藏所有實例變量)(可能通過重新定義方法inspect)。在Ruby中,foo.inspect可以打印出所有的實例變量 - 如果沒有訪問器,我們可以打印出一個單獨的變量嗎?

的主要問題是,如果我可以看到foo.inspect@bar是一個對象,具有實例變量@wah,其具有的"hello"的值,我可以打印出@wah直接,如果沒有訪問器(讀取器)可用於@bar@wah?通常,如果沒有訪問者,它不應該是可讀的,但如果出於調試目的呢?

回答

6

在Ruby中,所有的訪問保護可使用反射回避:

@bar.instance_variable_get(:@wah) 
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" 
+0

這是因爲attr_ *生成方法而不是變量。 – 2012-10-17 21:40:05

相關問題