如何解决具有极限的稀有数组
| 我有AR形式的对象数组 我想把它们限量出售。 当前方法如下: def rarefied_values(limit = 200)
all_values = self.values.all
rarefied_values = []
chunk_size = (all_values.size / limit.to_f).ceil
if all_values.size > limit
all_values.each_slice(chunk_size) do |chunk|
rarefied_values.push(chunk.first)
end
return rarefied_values
else
return all_values
end
end
有任何重构提示吗?
解决方法
def rarefied_values(limit = 200)
all_values = values.all
return all_values unless all_values.size > limit
chunk_size = all_values.size / limit
(0...limit).map{|i| all_values[i*chunk_size]}
end
红宝石重构的一些一般要点
self
通常可以省略。在某些情况下,例如cannot3ѭ。在这种情况下,self.values.all
=>values.all
如果其中一个条件处理的过程比其他条件处理的过程简单得多,则请首先放置该简单情况,然后使用return
从其余代码中删除它。在这种情况下,return all_values unless all_values.size > limit
通常,当您需要嵌套条件时,请对其进行设计,以使具有较简单操作步骤的箱子从伯爵身上分开,并将复杂的箱子放到最后。
让代码尽可能懒惰。在这种情况下,如果all_values.size > limit
则rarefied_values = []
是不必要的。所以把它放在条件部分。
,这是一个简单的重构,保留了相同的方法,但是删除了显式的return调用,并且仅在必要时执行某些转换:
def rarefied_values(limit = 200)
all_values = self.values.all
if all_values.size <= limit
all_values
else
chunk_size = (all_values.size / limit.to_f).ceil
[].tap{ |rare| all_values.each_slice(chunk_size){ |c| rare << c.first } }
end
end
这是一个更快,更简洁的版本:
def rarefied_values(limit = 200)
all_values = self.values.all
if (size = all_values.size) <= limit
all_values
else
all_values.values_at(*0.step(size-1,(size.to_f/limit).ceil))
end
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。