Ruby'First and Rest'逻辑

时间:2012-04-29 16:50:21

标签: ruby performance refactoring

我的应用程序正在达到我必须开始优化性能的程度。我发布了一些我认为可以改进的代码。

在视图中,我以某种方式处理索引中的第一个项目,而另一个方式处理其余项目。每次迭代一个新项目时,都会检查它(Ruby问自己..这个项目的索引是0吗?)

我觉得如果我可以通过用index.first?处理第一个特殊项目并以另一种方式处理其他项目来停止该行为(甚至不检查它们的索引是否为零),我觉得可以改善性能如何完成?

  <% @links.each_with_index do |link, index| %>
    <% if link.points == 0 then @points = "?" else @points = link.points %>
    <% end %>
    <% if index == 0 then %>
      <h1> First Item </h1>
    <% else %>
      <h1> Everything else </h1>
    <% end %>
  <% end %>
<% end %>

1 个答案:

答案 0 :(得分:3)

你可以非破坏性地这样做:

first, *rest = *my_array
# Do something with 'first'
rest.each{ |item| … }

...其中first将是第一个元素(如果my_array为空,则为nil),rest将始终为数组(可能为空)。

如果可以修改数组,则可以更轻松地获得相同的结果:

# remove the first item from the array and return it
first = my_array.shift
# do something with 'first'
my_array.each{ |item| … }

但是,这只会清理您的代码;它不会产生可测量的性能差异。