Ruby 是否基于if语句添加到实例?

Ruby 是否基于if语句添加到实例?,ruby,Ruby,我是一个新的程序员,试图用ruby创建一个简单的“剑工艺”终端应用程序。 因此,我有一个类,其中包含一些实例变量,我希望根据用户输入(@strength和@speed)进行迭代。因此,在这里,如果用户输入夹点是“直的”,我希望它将实例变量“强度”增加5-但是出于某种原因,无论我做什么,它都不会编辑它。我已经将“strength”设置为attr_访问器,并且我也尝试手动创建该方法-但是我仍然无法迭代它。我做错了什么 class Weapon attr_reader :id, :weapon

我是一个新的程序员,试图用ruby创建一个简单的“剑工艺”终端应用程序。 因此,我有一个类,其中包含一些实例变量,我希望根据用户输入(@strength和@speed)进行迭代。因此,在这里,如果用户输入夹点是“直的”,我希望它将实例变量“强度”增加5-但是出于某种原因,无论我做什么,它都不会编辑它。我已经将“strength”设置为attr_访问器,并且我也尝试手动创建该方法-但是我仍然无法迭代它。我做错了什么

class Weapon
    attr_reader :id, :weapon_name, :guard, :blade
    attr_accessor :grip, :strength, :speed

    SWORDS = []

    def initialize(weapon_name, grip, guard, blade)
        @id = SWORDS.length + 1
        @weapon_name = weapon_name
        @grip = grip.to_str
        @guard = guard
        @blade = blade
        @strength = 0
        @speed = 0
        SWORDS << self
    end

    def strength=(strength)
        if @grip == "straight"
            @strength = strength + 5
        end
    end
    
    def to_s
        
        "Your weapon is called: #{@weapon_name}
            The grip is: #{@grip}
            The guard is: #{@guard}
            The blade is: #{@blade}
            Total stats are: Strength = #{@strength} and Speed = #{@speed}"
    
    end
end

类武器
属性读取器:id、:武器名称、:守卫、:刀刃
属性访问器:抓地力、强度、速度
剑=[]
def初始化(武器名称、握力、防护装置、刀刃)
@id=剑。长度+1
@武器名称=武器名称
@grip=grip.to_str
@卫兵
@刀片=刀片
@强度=0
@速度=0

只有在引用类上的名称时,才会调用剑访问器

@strength = 0
这不会调用访问器。曾经即使定义了一个

self.strength = 0
这将调用访问器。现在,
attr\u访问器
定义了
strength
strength=
。如果您计划自己编写
strength=
,那么您需要的是
attr\u reader
,它不为您定义
strength=

class Weapon
  attr_reader :strength

  def initialize()
    ...
    self.strength = 0
  end

  ...

  def strength=(value)
    ...
  end

end

修改getter可能更容易:

class Weapon
  attr_accessor :grip, :strength

  # ...

  def strength
    if grip == 'straight'
      @strength + 5
    else
      @strength
    end
  end
end
由于getter始终会重新计算该值,因此您可以同时修改、
strength
grip
,它将立即反映更改:

w.grip = 'straight'
w.strength
#=> 15

w.strength = 12
w.strength
#=> 17

w.grip = 'curved'
w.strength
#=> 12

为了避免混淆,您可以调用初始强度
base\u-strength

此代码中没有用户输入。考虑把问题减少到A。到目前为止,它是不可复制的;我不能把它复制到一个新的文件中,然后遇到你描述的问题。哦,对不起,我忘了提到我正在IRB中测试它。我做了一个测试用例,比如加载“file.rb”。然后w=wearm.new(“剑名”、“笔直”、“向前”、“弯曲”)您的代码按预期工作。当我使用您评论中的行初始化武器时,调用
w.strength=10
w.to\u s
然后返回
总统计数据为:strength=15和Speed=0“
。您的条件分配似乎按预期工作。此线程可能会为您回答一些问题:
w.grip = 'straight'
w.strength
#=> 15

w.strength = 12
w.strength
#=> 17

w.grip = 'curved'
w.strength
#=> 12