2011-10-04 22 views
11

當我調用一個不存在的方法時,method_missing會告訴我方法的名稱。當我嘗試訪問尚未設置的變量時,該值僅爲nilRuby是否有未定義的實例變量的method_missing等價物?

我試圖動態攔截對無實例變量的訪問,並返回一個基於被訪問的變量名稱的值。最接近的相當於PHP的__get。 Ruby中是否有任何等效的功能?

+0

你知道警告和如何打開它嗎? –

回答

0

沒有一個instance_variable_missing(至少我知道) 但是,爲什麼你要訪問隨機命名的實例變量呢?

如果你通過方法調用線程訪問對象的所有狀態(就像你應該那樣),那麼你就不需要這個了。

如果您正在尋找一種方法來定義魔術材料而不搞亂方法查找,您可能需要使用const_missing

+0

變量不是隨機命名的。爲了測試目的,我正在播放郵件,而不通過負責設置實例變量的郵件程序。該視圖將嘗試訪問諸如'@ user.name'而不設置'@ user'的東西。我以爲我可以在第一次閱讀時爲'@ user'等動態生成FactoryGirl對象。 – meagar

+0

我看到謝謝。 AFAICT恐怕你唯一的選擇是閱讀模板文件並相應地設置變量(或者可能需要解決問題並在你的電子郵件模板中使用'method_missing')。這是一個遺憾,因爲當你訪問一個未定義的變量時,即使_knows_也會給你一個警告。 – riffraff

2

我不認爲這是可能的Ruby中。推薦的方法是在模板中使用「user」方法而不是「@user」實例var。

這與您在外部處理Ruby對象的方式一致(''obj.user''是引用''@user''但實際上不是''@user''本身)的方法。如果您需要任何種類的具有屬性的特殊邏輯,最好的辦法就是使用方法(或method_missing),無論您是從內部還是外部訪問它。

1

查看我的answer to another similar question。但只是因爲你可以這並不意味着這是一個好主意。明智的設計通常可以克服對這類事物的需求,並允許您生成更具可讀性且可維護的代碼。

instance_variable_get似乎是我所看到的(儘管我不是PHP用戶)與PHP的__get最相近。

查看relevant Ruby source code,變量的唯一「缺失」方法是常量的const_missing,實例變量沒有。

+1

沒有幫助。我將不得不將所有的實例變量用法轉換爲方法調用,這是完全不切實際的。 – meagar

+0

那麼在Ruby中沒有這樣的設施來動態訪問實例變量,而不是我在其他答案中所描述的。查看上面更新的答案。 – arcresu

相關問題