我需要将此代码干燥,但我不知道如何。
我试图干燥if条件,但是我不知道该如何放置。
Aggregate (cost=23675.97..23675.97 rows=1 width=8)
->; Seq Scan on t (cost=0.00..22930.97 rows=1489990 width=23)
答案 0 :(得分:3)
欢迎堆栈溢出!
首先,我要指出“干”代表“不要重复自己”。既然这里没有重复,那么这段代码并不是真正的问题。
这里最大的问题是它不粗鲁。红宝石社区有某些事情要得到批准,有的事情要避免。就是说,while
循环本身被认为是不好的红宝石,因此,如果有人告诉您使用while循环编写它,我想您是在试图让我们为您做功课。>
因此,我将为您提供几件事,以便进行网络搜索,这将帮助您入门:
if-else-end
简化为简单的if
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
(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)
也是奇数时也可以使用。