【发布时间】:2021-02-10 06:03:58
【问题描述】:
我有一些遗留代码,对 Ruby 来说是全新的。我想更改 Ruby 中类实例的值。
class CoffeeMachine
attr_reader :water
def initialize
@water = 100
end
end
machine = CoffeeMachine.new
machine.water
我现在想将machine.water 更改为70。我了解到这些实例是通过称为“封装”的东西受到保护的。但是我想知道是否没有任何方法可以更改此变量。在this 和this 之后,我尝试将其更改为:
machine.class_eval {@water = 70}
但它不起作用。当我像这样打印出来时
puts machine.class_eval '@water' 它显示 70,但是当我在我的程序中使用它时,它不知何故没有被存储。
【问题讨论】:
-
为什么不使用
attr_accessor :water? -
然而这违反了封装,你可以这样做:
machine.instance_variable_set(:"@water", 70)来设置实例变量的值。虽然我建议使用attr_accessor,因为它提供了 getter 和 setter 方法。 -
@Tom :我猜你的意思是你想改变 instance 变量 的值,而不是 instance 的值。如果您想更改它,为什么要明确声明
water为从外部不可更改?这没有意义。 -
使用
attr_reader,您只需指定可以读取环境变量。基本上,它为此变量生成一个访问器方法。同样,attr_writer为变量创建了一个 setter 方法。attr_accessor两者都创建。见here。 -
或者,您可以使用
machine.instance_eval { @water=70 }。请注意,class_eval将允许在类范围内使用变量,而instance_eval,顾名思义,可用于摆弄实例变量。当然,如果可能的话,你会避免两者,因为它们的使用破坏了封装的想法。