Ruby IF / else冷凝

时间:2017-09-22 11:30:10

标签: arrays ruby if-statement

这是我一直在研究的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

3 个答案:

答案 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

Full Example

在旁注上,@ DanilSperansky指出了这一行

elsif over >= r3[1] * 2

永远不会被执行,因为它等于elsif over >= r3[2]。所以我没有将其包含在上面的Hash中。我相信你可以弄清楚如何处理这个问题。