Подтвердить что ты не робот

Как преобразовать логические значения в целые числа?

У меня есть логическое значение, чтобы проверить, истинно ли оно, а затем установить локальную переменную. Как мне реорганизовать это, чтобы он был больше Ruby-ish?

if firm.inflection_point
  inflection_point = 1
else
  inflection_point = 0
end
4b9b3361

Ответ 1

inflection_point = (firm.inflection_point ? 1 : 0)

Ответ 2

Если у вас есть это в какой-то момент, то ответ rudolph9 хорош, но если у вас есть подобная логика повсюду, то, возможно, это может иметь смысл с общим упором на патч обезьяны:

class FalseClass; def to_i; 0 end end
class TrueClass; def to_i; 1 end end

inflection_point = firm.inflection_point.to_i

В Ruby вы должны придерживаться всей своей логики, имея в виду значения истинности, а не 0 и 1, но, я думаю, вы имеете дело с некоторыми входами или выходами из/в некоторую внешнюю систему, которая имеет дело с 0 и 1. Тогда, делая это, будет иметь смысл.

Ответ 3

Другой альтернативой является использование операторов короткого замыкания:

inflection_point && 1 || 0


irb(main):001:0> true && 1 || 0
=> 1
irb(main):002:0> false && 1 || 0
=> 0

Ответ 4

В Ruby выражение if является выражением. Нет необходимости назначать переменную внутри ветвей then и else, просто верните требуемое значение и назначьте переменную результат if expression:

inflection_point = if firm.inflection_point
  1
else
  0
end

В простых случаях, подобных этому, более читаемо писать все выражение в одной строке:

inflection_point = if firm.inflection_point then 1 else 0 end

Вы также можете использовать условный оператор, который я лично считаю менее понятным:

inflection_point = firm.inflection_point ? 1 : 0

Ответ 5

Вам нужна условная операция, известная как Тернарный оператор Он используется почти на каждом языке и использует символы? и:

inflection_point = firm.inflection_point ? 1 : 0

в основном означает, что если первое условие оценивается как true (firm.inflection_point), верните значение после "?" (1) в противном случае вернуть значение после ":" (0)

Ответ 6

Здесь другой метод:

5 - bool.to_s.length

Это использует тот факт, что 'true' имеет четыре символа, а 'false' имеет 5.