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