2012-04-29 9 views
1

私のアプリはパフォーマンスのために最適化を開始する必要があります。私は私の見解から改善できる気がするコードをいくつか掲載しました。Ruby 'First and Rest' Logic

私は、インデックスの最初のアイテムを特定の方法で、残りのアイテムを別の方法で扱っています。新しいアイテムが繰り返し処理されるたびに、(この項目は0のインデックスを持っています。.. Rubyは自分自身に尋ねる?)をチェックしている私が最初に処理することにより、その動作を停止することができるかどう

が、私はパフォーマンスのように改善することができると感じ項目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 %> 
+0

最初のアイテムがレンダリングされた後、最初のアイテムを「ポップ」し、残りのインデックスを反復する戦略について考えていますか?誰かがこれを行うより効率的な方法を見ている? – Dru

+0

それは私がそれをする方法です....しかし、私は真剣にそれが問題だと疑っています。それはかなりコードではないかもしれませんが、あなたのレンダリング時間に深刻な影響を与えている方法はありません。 –

+7

実際のベンチマークを実行せずにコードのパフォーマンスを前提にして、実際には遅いことを示してください。 –

答えて

3

:(my_arrayでは空だった場合やnilfirstが最初の要素となり、restは常に空の可能性(配列になります

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

... )。

それはあなたの配列を変更するためにOKだ場合は、より簡単に同じ結果を得ることができます。

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

しかし、これが唯一のあなたのコードをクリーンアップします。測定可能なパフォーマンスの違いはありません。