我有一个最初为0的整数,在计算之后,通常会在0到99之间结束。问题是,从游戏的早期开始,它经常计算为0或1,它被指定为TrueClass或FalseClass而不是数值,这会混淆未来的x> 0比较。是否有一种内置的Ruby方法来强制变量成为Fixnum / Integer类型,还是我必须对它进行monkeypatch呢?
以下是适用的代码:
mdef_multi = self.mdef_multi
# Step 11: Modify the Magic Defense Multiplier
# If Toad
mdef_multi = 0 if user.states.include?(11)
# If Charging
mdef_multi = 0 if user.states.include?(30)
# If cast on self or PC onto PC
# 0 if PC targetting PC
mdef_multi = self.is_a?(Game_Actor) and user.is_a?(Game_Actor) ? 0 : mdef_multi
# 99 MDef Multi if max MDef
mdef_multi = self.is_a?(Game_Enemy) and mdef == 255 ? 99 : mdef_multi
# If Solo Multiplier is enabled
mdef_multi = obj.element_set.include?(26) ? 1 : mdef_multi
# Step 12: Modify the Spell Multiplier
hits = 0, missed = 0, evaded = 0
while spl_multi > 0
spl_multi -= 1
if rand(99) <= hit
if mdef_multi > 0
最后一行是我遇到变量类型的问题。 它是技术上来自RPG Maker VX的RGSS2。请原谅 我可怕的评论和编码风格。
答案 0 :(得分:4)
首先,Ruby不会自动转换内容,因此您的整数不会转换为布尔值,因为它是0或1。
相反,正在发生的是行
mdef_multi = self.is_a?(Game_Actor) and user.is_a?(Game_Actor) ? 0 : mdef_multi
正在被解析为
( mdef_multi = self.is_a?(Game_Actor) ) and user.is_a?(Game_Actor) ? 0 : mdef_multi
因为and
的工作方式。基本上=
的优先级高于and
,因此变量仅设置为and
之前的结果,即true
/ false
值。 &&
的优先级高于=
,因此在此处使用&&
应该有效。出于这个原因,一些Ruby程序员建议仅使用&&
,而不是and
。有关详细说明,请参阅http://blog.jayfields.com/2007/08/ruby-operator-precedence-of-and-which.html。
如果您在此行和下一行使用&&
而不是and
,则应解决此问题。