在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