【问题标题】:how to change instance variables in class in ruby如何在ruby中更改类中的实例变量
【发布时间】: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。我了解到这些实例是通过称为“封装”的东西受到保护的。但是我想知道是否没有任何方法可以更改此变量。在thisthis 之后,我尝试将其更改为:

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,顾名思义,可用于摆弄实例变量。当然,如果可能的话,你会避免两者,因为它们的使用破坏了封装的想法。

标签: ruby instance


【解决方案1】:

在您的场景中,这将是更方便的处理方式

class CoffeeMachine
  attr_reader :water
  def initialize(water=100)
    @water = water
  end
end
machine = CoffeeMachine.new

machine.water # 100

machine = CoffeeMachine.new(70)

machine.water # 70

【讨论】:

    【解决方案2】:

    正如@Surya 建议的那样,也可以这样做:

        class CoffeeMachine
          attr_accessor :water
          def initialize
            @water = 100
          end
        end
    

    然后这样做:

       machine = CoffeeMachine.new
       machine.water #100
     
       machine.water = 70
       machine.water #70
    

    【讨论】:

    • 如果我们使用attr_accessor,我们不需要使用attr_reader,因为它适用于set和get。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    • 2014-09-21
    • 2013-11-26
    • 2014-10-23
    • 1970-01-01
    相关资源
    最近更新 更多