У меня есть логическое значение, чтобы проверить, истинно ли оно, а затем установить локальную переменную. Как мне реорганизовать это, чтобы он был больше Ruby-ish?
if firm.inflection_point
inflection_point = 1
else
inflection_point = 0
end
У меня есть логическое значение, чтобы проверить, истинно ли оно, а затем установить локальную переменную. Как мне реорганизовать это, чтобы он был больше Ruby-ish?
if firm.inflection_point
inflection_point = 1
else
inflection_point = 0
end
inflection_point = (firm.inflection_point ? 1 : 0)
Если у вас есть это в какой-то момент, то ответ 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
. Тогда, делая это, будет иметь смысл.
Другой альтернативой является использование операторов короткого замыкания:
inflection_point && 1 || 0
irb(main):001:0> true && 1 || 0
=> 1
irb(main):002:0> false && 1 || 0
=> 0
В 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
Вам нужна условная операция, известная как Тернарный оператор Он используется почти на каждом языке и использует символы? и:
inflection_point = firm.inflection_point ? 1 : 0
в основном означает, что если первое условие оценивается как true (firm.inflection_point), верните значение после "?" (1) в противном случае вернуть значение после ":" (0)
Здесь другой метод:
5 - bool.to_s.length
Это использует тот факт, что 'true'
имеет четыре символа, а 'false'
имеет 5.