Ruby:强制整数(Fixnum / Bignum)超过布尔值

时间:2010-07-21 05:11:04

标签: ruby integer boolean

我有一个最初为0的整数,在计算之后,通常会在0到99之间结束。问题是,从游戏的早期开始,它经常计算为0或1,它被指定为TrueClass或FalseClass而不是数值,这会混淆未来的x> 0比较。是否有一种内置的Ruby方法来强制变量成为Fixnum / Integer类型,还是我必须对它进行monkeypatch呢?

以下是适用的代码:

步骤10:计算目标的魔法防守乘数

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。请原谅 我可怕的评论和编码风格。

1 个答案:

答案 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,则应解决此问题。