我怎样才能烘干这个while循环?

时间:2019-07-17 15:38:23

标签: ruby loops dry

我需要将此代码干燥,但我不知道如何。

我试图干燥if条件,但是我不知道该如何放置。

Aggr­egat­e (cos­t=23­675.­97..­2367­5.97­ rows­=1 widt­h=8)­
->­; Seq Scan­ on t (cos­t=0.­00..­2293­0.97­ rows­=148­9990­ widt­h=23­)

4 个答案:

答案 0 :(得分:3)

欢迎堆栈溢出!

首先,我要指出“干”代表“不要重复自己”。既然这里没有重复,那么这段代码并不是真正的问题。

这里最大的问题是它不粗鲁。红宝石社区有某些事情要得到批准,有的事情要避免。就是说,while循环本身被认为是不好的红宝石,因此,如果有人告诉您使用while循环编写它,我想您是在试图让我们为您做功课。

因此,我将为您提供几件事,以便进行网络搜索,这将帮助您入门:

  • 红宝石保护条款-这会将您的if-else-end简化为简单的if
  • ruby​​数组pop-您可以执行while item = array.pop-由于一旦数组为空,pop将返回nil,因此不需要计数。再次,糟糕的红宝石可以做到这一点...但是可以考虑使用while array.any?
  • 红宝石隐式方法返回-通常我们避免使用不需要的命令

值得注意的是,使用上述技术,您可以将方法的内容减少到7条合理可读的行。如果允许您使用.inject.sum代替while,则整个方法将变成2行。

HP_hovercraft指出,三元运算符将此行减少为1行。在生产代码上,我倾向于将其保留为2行以提高可读性-但这只是个人喜好)

答案 1 :(得分:1)

您可以将整个内容与三元数据放在一行中:

def sum_with_while(min, max)
  min > max ? -1 : [*(min..max)].inject(0){|sum,x| sum + x }
end

答案 2 :(得分:1)

这是一种清除代码的方法,请参见注释:

def sum_with_while(range) # pass a range
  array = range.to_a
  sum, count = 0, 0 # parallel assignment
  while count < array.length
    sum += array[count]
    count += 1
  end
  sum # no need to return
end


sum_with_while(10..20)
#=> 165


更多Rubyish:

(min..max).sum

答案 3 :(得分:1)

规则1:选择正确的算法。

您希望计算一个算术级数 1

def sum_with_while(min, max)
  max >= min ? (max-min+1)*(min+max)/2 : -1   
end

sum_with_while(4, 4)
  #=> 4 
sum_with_while(4, 6)
  #=> 15 
sum_with_while(101, 9999999999999)
  #=> 49999999999994999999994950

1。算术级数是算术序列的元素之和。后者的每一项都是通过添加固定常数n(可能为负)来根据前一项计算的。这里max-min+1是序列中的项数,如果(min+max)/2是偶数,则(min+max)是序列中值的平均值。由于(max-min+1)*(min+max)是偶数,因此(min+max)也是奇数时也可以使用。