如何将布尔值转换为整数?
我有一个布尔值来检查它是否为真,然后设置一个局部变量。 我如何重构这一点,以便更多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个字符。