Ruby: форсирование целого числа (Fixnum / Bignum) над логическим - PullRequest
0 голосов
/ 21 июля 2010

У меня есть целое число, которое изначально равно 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

В последней строке я сталкиваюсь с проблемой типа переменной. Технически это RGSS2 от RPG Maker VX. И, пожалуйста, извините мой ужасный стиль комментирования и кодирования.

1 Ответ

4 голосов
/ 21 июля 2010

Прежде всего, 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 в этой и следующей строках, это должно решить проблему.

...