![](/img/trans.png)
[英]Ruby: How do I convert a string (ARGV) representation of integers and ranges to an array of integers
[英]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 中,您應該讓所有邏輯處理真值而不是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
基本上意味着,如果第一個條件評估為真(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
方法以解決這個問題。
我需要輕輕地通知猴子修補TrueClass
和FalseClass
可能對您的系統造成危險
一個好的方法是使用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.