簡體   English   中英

如何將布爾值轉換為整數?

[英]How do I convert boolean values to integers?

我有一個布爾值來檢查它是否為真,然后設置一個局部變量。 我如何重構它以使其更像 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 中,您應該讓所有邏輯處理真值而不是01 ,但我猜您正在處理來自/到某些處理01外部系統的一些輸入或輸出。 那么,這樣做是有意義的。

另一種選擇是使用短路運算符:

inflection_point && 1 || 0


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

在 Ruby 中, if是一個表達式。 無需在thenelse分支內分配變量,只需返回您想要的值並將變量分配給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

基本上意味着,如果第一個條件評估為真(firm.inflection_point),則返回“?”之后的值。 (1) 否則,返回“:”后的值 (0)

這是另一種方法:

5 - bool.to_s.length

這利用了'true'有四個字符,而'false'有 5 個字符的事實。

它不是純 ruby​​ 解決方案,但是,您可以使用ActiveRecord::Type::Integer.new.cast(true)

我剛剛注意到很多人提出給 Monkey Patch ruby​​ 類並在它們上實現.to_i方法以解決這個問題。

我需要輕輕地通知猴子修補TrueClassFalseClass 可能對您的系統造成危險

一個好的方法是使用Ruby Refinements來制作更安全的猴子補丁。 這種方法將猴子補丁類的更改限制在您的類的范圍內。

  • lib/refinements/boolean_refinements.rb
module BooleanRefinements
  refine FalseClass do
    def to_i
      0
    end
  end

  refine TrueClass do
    def to_i
      1
    end
  end
end
  • /your_class.rb
require 'refinements/boolean_refinements'

class MyClass
  using BooleanRefinements

  # Here you can use true.to_i and false.to_i as you wish
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM