如何将布尔值转换为整数?

mar*_*ion 28 ruby boolean

我有一个布尔值来检查它是否为真,然后设置一个局部变量.我如何重构这一点,以便更多Ruby-ish?

if firm.inflection_point
  inflection_point = 1
else
  inflection_point = 0
end
Run Code Online (Sandbox Code Playgroud)

rud*_*ph9 61

inflection_point = (firm.inflection_point ? 1 : 0)
Run Code Online (Sandbox Code Playgroud)


saw*_*awa 17

如果你只是在某一点上,那么rudolph9的答案是好的,但是如果你在整个地方都有类似的逻辑,那么对于猴子补丁的一般用途可能是有意义的:

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

inflection_point = firm.inflection_point.to_i
Run Code Online (Sandbox Code Playgroud)

在Ruby中,你应该保持所有的逻辑处理真值而不是01,但我想你正在处理来自某些处理0和处理的外部系统的输入或输出1.然后,这样做会有意义.

  • 问题是'0 == true`所以这可能会给那些支持你的代码库的人造成很大的困惑. (4认同)

And*_*edo 11

另一种选择是使用短路运算符:

inflection_point && 1 || 0


irb(main):001:0> true && 1 || 0
=> 1
irb(main):002:0> false && 1 || 0
=> 0
Run Code Online (Sandbox Code Playgroud)


Jör*_*tag 6

In Ruby, if is an expression. There's no need to assign to a variable inside the then and else branches, just return the value you want and assign the variable to the result of the if expression:

inflection_point = if firm.inflection_point
  1
else
  0
end
Run Code Online (Sandbox Code Playgroud)

In simple cases like this, it's more readable to write the entire expression on a single line:

inflection_point = if firm.inflection_point then 1 else 0 end
Run Code Online (Sandbox Code Playgroud)

You can also use the conditional operator, which I personally find to be much less readable:

inflection_point = firm.inflection_point ? 1 : 0
Run Code Online (Sandbox Code Playgroud)


the*_*der 5

您需要的是一个被称为三元运算符的条件运算,它几乎在所有语言中都使用,并且使用符号 ? 和 :

inflection_point = firm.inflection_point ? 1 : 0
Run Code Online (Sandbox Code Playgroud)

基本上意味着,如果第一个条件计算为真(firm.inflection_point),则返回“?”之后的值 (1) 否则,返回“:”后的值(0)

  • 首先:它称为条件运算符,而不是三元运算符。说“三元运算符”甚至没有意义,三元运算符的数量是无限的。其次,您在 Ruby 中“不需要”条件运算符。你在“几乎所有其他语言”中都需要它,因为在这些语言中 `if` 是一个语句。但 Ruby 没有语句,它只有表达式,因此“if”也是一个表达式。 (5认同)
  • 摘自《Ruby 编程语言》,作者:D. Flanagan 和 Y. Matsumoto _4.6.10 条件: ?: ?: 运算符称为条件运算符。它是 Ruby 中唯一的三元运算符(三个操作数)。第一个操作数出现在问号之前。第二个操作数出现在问号和冒号之间。第三个操作数出现在冒号之后。_你最好写信给这些人并告诉他们改正他们的书。 (5认同)
  • 我认为如果桌子上有一个苹果,它就是“苹果”,如果天空中有太阳,它就是“太阳”。如果它是代码中唯一的三元运算符,它就是“三元”。也是“A”三元。我的意思是,如果我们对词汇过于迂腐的话。 (3认同)
  • @thebugfinder 这本书是正确的:它被称为 **条件** 运算符。这实际上是@JörgWMittag 所表达的观点。`` 它可能是 Ruby 提供的唯一三元运算符,但这并不意味着“三元运算符”就是它的正确名称。 (2认同)

小智 5

它不是纯红宝石解决方案,但是,您可以使用ActiveRecord::Type::Integer.new.cast(true)