Ruby中的類實例變量的工作原理是Ruby類是實例本身(類Class的實例)。通過檢查DummyClass.class
來嘗試自己。 Ruby中的C#意義上沒有「靜態方法」,因爲每個方法都在某個實例上定義(或繼承)並在某個實例上調用。因此,他們可以訪問被調用者可用的任何實例變量。
由於DummyClass
是一個實例,它可以擁有自己的實例變量。你甚至可以訪問那些實例變量,只要你有一個類的引用(應該總是因爲類名是常量)。在任何時候,您都可以調用::DummyClass.instance_variable_get(:@arr)
並獲取該實例變量的當前值。
至於是否是件好事,取決於方法。
如果@arr
邏輯上是實例/類DummyClass
的「狀態」,則將其存儲在實例變量中。如果@arr
僅作爲可操作的快捷方式在dummy_method2
中使用,則將其作爲參數傳遞。爲了給出一個使用實例變量方法的例子,請考慮Rails中的ActiveRecord。它允許你這樣做:
u = User.new
u.name = "foobar"
u.save
這裏,分配給用戶的名稱是合法用戶的數據。如果在撥打#save
之前,有人要問「此時用戶的姓名是什麼」,則可以回答「foobar」。如果你深入挖掘內部元素(你會深入挖掘很多元編程,你會發現他們使用實例變量)。
我用過的示例包含兩個單獨的公共調用。要查看實例變量仍在使用中的情況,請查看#update_attributes
的ActiveRecord實現。方法體僅僅是load(attributes, false) && save
。爲什麼#save
不會傳遞任何參數(如新的name
),即使它將保存在UPDATE users SET name='foobar' WHERE id=1;
之類的內容中?這是因爲名稱之類的東西是屬於實例的信息。
相反,我們可以看一下實例變量無法使用的情況。查看#link_to_if
的實現,該方法接受布爾型ish參數(通常是源代碼中的表達式)以及#link_to
通常接受的參數,例如鏈接到的URL。當布爾條件爲truthy時,它需要將其餘參數傳遞給#link_to
並調用它。在這裏分配實例變量沒有多大意義,因爲您不會說這裏的調用上下文(渲染器)在實例中包含該信息。渲染器本身沒有「鏈接到的URL」,因此它不應該被隱藏在實例變量中。
非常感謝你對這個很好的解釋,特別是關於這是否是一種好的做法。 – tackleberry 2012-02-16 13:21:17