我定義了一些范圍:
very_low = <10
low = 11-20
medium = 21-30
high = 31-40
very_high = 41
在 Ruby 中找出任何給定數字屬于哪個類別的最簡潔的方法是什么?
例如,知道 23 將是“中等”
uj5u.com熱心網友回復:
我會做:
RANGES = {
very_low: (..10),
low: (11..20),
medium: (21..30),
high: (31..40),
very_high: (41..)
}
def range_for(number)
RANGES.find { |_, range| range.cover?(number) }.first
end
range_for(23)
#=> :medium
它使用Enumerable#findwithRange#cover?來選擇匹配的范圍定義。該find方法回傳一個包含鍵和值的陣列。然后,鏈式first呼叫從陣列中選擇鍵,這將是請求的范圍識別符號。
uj5u.com熱心網友回復:
你已經改變了你的問題,但你現在有重疊(40和40 )......我不知道你是在使用整數還是小數,但我假設整數,因為你沒有處理“10”或“10.5”……這個怎么樣:
def which_range? num
ranges={
very_low: (..10),
low: (11..20),
medium: (21..30),
high: (31..40),
very_high: (41..)
}
ranges.each do |key,val|
return key if val.include?(num)
end
return false
end
示例輸出:
2.7.2 :073 > which_range? 23
=> :medium
2.7.2 :074 > which_range? 7
=> :very_low
2.7.2 :075 > which_range? 25
=> :medium
2.7.2 :076 > which_range? 35
=> :high
2.7.2 :077 > which_range? 45
=> :very_high
2.7.2 :123 > which_range? 102
=> :very_high
2.7.2 :124 > which_range? -12
=> :very_low
uj5u.com熱心網友回復:
如果我正確地回答了您的問題,那么案例陳述也許就是您要尋找的東西
case some_number
when ..10 then 'very_low'
when 11..20 then 'low'
when 40.. then 'very_high'
...
end
# P.S.: for older versions without endless ranges:
case some_number
when -Float::INFINITY..10 then 'very_low'
when 11..20 then 'low'
when 40..Float::INFINITY then 'very_high'
...
end
uj5u.com熱心網友回復:
假設范圍是連續的,您可以按從低到高(使用上限時)或從高到低(使用下限時)的順序定義陣列中的上限或下限。然后在同一索引處有一個具有各自名稱的陣列。
def range_name(number)
range_names = ['very_low', 'low', 'medium', 'high', 'very_high' ]
upper_bounds = [ 10 , 20 , 30 , 40 , Float::INFINITY] # inclusive
index = upper_bounds.find_index { |upper_bound| number <= upper_bound }
range_names[index]
end
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/495322.html
標籤:红宝石
