在Ruby中重要的是要記住變量和它們所保持的對象之間的區別。簡單地設置變量將永遠不會改變該變量引用的對象。當你做a += b
時,它只是a = a + b
的簡寫。所以你要爲變量a賦一個新的值,而不是改變曾經存在的對象或者改變對該對象的任何其他引用。因此更改變量time
不會更改@start
。
爲了分配給一個實例變量,您需要實際分配給該實例變量。這裏有一個方式做你正在尋找:
operation = :+
amount = 12
@start, @end = [@start, @end].map {|time| time.send(operation, amount)}
你會發現,我們不與:add
和:sub
業務faffing周圍要麼 - 我們就可以通過郵件的實際名稱,我們要發送(在這種情況下,我使用+,但它可以是任何東西)。
如果你有一個大的,動態生成的ivars列表,你想設置,這只是一點點複雜。唯一的區別是需要按名稱獲取和設置ivars。
ivars = [:@start, :@end, :@something_else]
operation = :+
amount = 12
ivars.each {|ivar| instance_variable_set(ivar, instance_variable_get(ivar).send(operation, amount))}
非常感謝。假設不適用於Ruby。 – cfeduke 2009-09-29 14:09:50