如何在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

我有一些遗留代码,对Ruby是全新的。我想在Ruby中更改类实例的值

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都有效。