【问题标题】:Ruby: Forcing an Integer (Fixnum/Bignum) over BooleanRuby:在布尔值上强制使用整数(Fixnum/Bignum)
【发布时间】:2010-07-21 05:11:04
【问题描述】:

我有一个初始为 0 的整数,经过计算后,通常会在 0 到 99 之间结束。问题是,从游戏早期开始,它经常计算为 0 或 1,它被分配为 TrueClass或 FalseClass 而不是数值,这会扰乱未来的 x > 0 比较。是否有内置的 Ruby 方法可以强制变量成为 Fixnum/Integer 类型,还是我必须对其进行猴子补丁?

这是它适用的代码:

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

【问题讨论】:

    标签: ruby integer boolean


    【解决方案1】:

    首先,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 值。 &amp;&amp; 的优先级高于 =,所以在这里使用 &amp;&amp; 应该可以工作。出于这个原因,一些 Ruby 程序员建议只使用&amp;&amp;,而不是and。更多解释见http://blog.jayfields.com/2007/08/ruby-operator-precedence-of-and-which.html

    如果您在这一行和下一行使用&amp;&amp; 而不是and,它应该可以解决问题。

    【讨论】:

    • 啊,我明白了。惊人的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多