如何在ruby中更改类中的实例变量
我有一些遗留代码,对Ruby是全新的。我想在Ruby中更改类实例的值如何在ruby中更改类中的实例变量,ruby,instance,Ruby,Instance,我有一些遗留代码,对Ruby是全新的。我想在Ruby中更改类实例的值 class CoffeeMachine attr_reader :water def initialize @water = 100 end end machine = CoffeeMachine.new machine.water 我现在想把机器.水换成70。我了解到这些实例是通过所谓的“封装”来保护的。但是我想知道是否有任何方法可以改变这个变量。我试着这样改变它: machine.class_eval
class CoffeeMachine
attr_reader :water
def initialize
@water = 100
end
end
machine = CoffeeMachine.new
machine.water
我现在想把机器.水换成70。我了解到这些实例是通过所谓的“封装”来保护的。但是我想知道是否有任何方法可以改变这个变量。我试着这样改变它:
machine.class_eval{@water=70}
但它不起作用。当我像这样打印出来的时候
放置machine.class\u eval'@water'
它显示70,但当我在程序中使用它时,不知何故它不会被存储。在您的场景中,这将是更方便的处理方式
class CoffeeMachine
attr_reader :water
def initialize(water=100)
@water = water
end
end
在您的场景中,这将是更方便的处理方式
class CoffeeMachine
attr_reader :water
def initialize(water=100)
@water = water
end
end
正如@Surya所建议的,也可以这样做:
class CoffeeMachine
attr_accessor :water
def initialize
@water = 100
end
end
然后这样做:
machine = CoffeeMachine.new
machine.water #100
machine.water = 70
machine.water #70
正如@Surya所建议的,也可以这样做:
class CoffeeMachine
attr_accessor :water
def initialize
@water = 100
end
end
然后这样做:
machine = CoffeeMachine.new
machine.water #100
machine.water = 70
machine.water #70
为什么不使用?但是这违反了封装,您可以这样做:
machine.instance\u variable\u set(:“@water”,70)
来设置实例变量的值。尽管我建议使用attr\u accessor
,因为它同时提供getter和setter方法。@Tom:我猜您的意思是要更改实例变量的值,而不是实例的值。如果你想改变水,为什么你要明确声明水从外部是不可改变的?这没有意义。使用attr\u reader
,您只指定可以读取环境变量。基本上,它为这个变量生成一个访问器方法。类似地,attr_writer
为变量创建setter方法<代码>属性访问器同时创建这两个属性。或者,您可以使用machine.instance_eval{@water=70}
。请注意,class\u eval
允许类作用域上的变量,而instance\u eval
,顾名思义,可以用来摆弄实例变量。当然,如果可能的话,您将避免两者,因为它们的使用打破了封装的概念。为什么不使用?但是这违反了封装,您可以执行:machine.instance\u variable\u set(:“@water”,70)
来设置实例变量的值。尽管我建议使用attr\u accessor
,因为它同时提供getter和setter方法。@Tom:我猜您的意思是要更改实例变量的值,而不是实例的值。如果你想改变水,为什么你要明确声明水从外部是不可改变的?这没有意义。使用attr\u reader
,您只指定可以读取环境变量。基本上,它为这个变量生成一个访问器方法。类似地,attr_writer
为变量创建setter方法<代码>属性访问器同时创建这两个属性。或者,您可以使用machine.instance_eval{@water=70}
。请注意,class\u eval
允许类作用域上的变量,而instance\u eval
,顾名思义,可以用来摆弄实例变量。当然,如果可能的话,你会避免两者,因为它们的使用打破了封装的概念。如果我们使用attr\u访问器,我们不需要使用attr\u阅读器
,因为它对set和get都有效。如果我们使用attr\u访问器,我们不需要使用attr\u阅读器
,因为它对set和get都有效。