具有极限的稀有数组

如何解决具有极限的稀有数组

| 我有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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?