这是我一直在研究的Ruby脚本的一部分,并希望以某种方式压缩这个if语句。如何使这个代码更短或更轻,可能使用r3 [i- = 1]在迭代循环中自动化?它是从一个数组拉出来的:
r3=[5.0, 10.0, 20.0, 50.0, 70.0, 90.0]
if over > r3[5]
nx = r3[5]
puts "Adds #{nx}"
elsif over >= r3[4]
nx = r3[4]
puts "Adds #{nx}"
elsif over >= r3[3] #25
nx = r3[3]
puts "Adds #{nx}"
elsif over >= r3[2]
nx = r3[2] * 2
puts "Adds #{nx}"
elsif over >= r3[1] * 2 #5lbs
nx = r3[1] * 2
puts "Adds #{nx}"
else
nx = r3[0]
puts "Adds #{nx}"
end
答案 0 :(得分:0)
试试这个
for i in (1..5).to_a.reverse
if(i==5 && over > r3[i] || i!=5 && over >= r3[i] || i==0)
nx = [1,2].include?(i) ? r3[i] * 2 : r3[i]
puts "Adds #{nx}"
break;
end
end
答案 1 :(得分:0)
它并非100%准确。但也许你正在寻找这样的东西:
r = [5.0, 10.0, 20.0, 50.0, 70.0, 90.0]
value = 30
nx = r.reverse.find { |e| e < value }
nx *= 2 if [10.0, 20.0].include? nx
puts nx
答案 2 :(得分:0)
我会使用Hash
键将其重组为Range
,如下所示:
h = {
(20...50)=> 40.0, # r3[2] * 2
(50...70)=> 50.0, # r3[3]
(70..90)=> 70.0, # r3[4]
(90..Float::INFINITY) => 90.0 #r3[5]
}
然后迭代为:
# the ->{[5.0]} is to handle your else statement
# where the over variable is less than 20.0
h.detect(->{[5.0]}) {|k,_v| k.cover?(over)}.pop
在旁注上,@ DanilSperansky指出了这一行
elsif over >= r3[1] * 2
永远不会被执行,因为它等于elsif over >= r3[2]
。所以我没有将其包含在上面的Hash
中。我相信你可以弄清楚如何处理这个问题。