2013-08-13 6 views
8

Rubyではfor-loopsを使うのは悪いスタイルです。これは一般的に理解されています。私には、推奨 スタイルガイド: (https://github.com/bbatsov/ruby-style-guide#source-code-layout) は言う:Rubyでforループを置き換えるにはどうしたらいいですか?

「あなたは理由を正確に知っている限り決して、使用しない時イテレータのほとんどは、それぞれの面に実装されているために代わりに使用する必要があります(そう。インジケーションのレベルを追加していますが、新しいスコープを導入しないために、そのブロックに定義されている変数が外部に表示されるようになりました。所与

例は:

arr = [1, 2, 3] 

#bad 
for elem in arr do 
    puts elem 
end 

# good 
arr.each { |elem| puts elem } 

私が研究していると私は場所に渡すかに算術演算を実行することができる反復値を提供するforループをシミュレートする方法として、私は説明を見つけることができません。例えば は、何で私が置き換えます:それは1つの配列だが、私は多くの場合、他の目的のために現在の位置を必要とする場合

for i in 0...size do 
    puts array1[i] 
    puts array2[size-1 - i] 
    puts i % 2 
end 

それは簡単です。 私は行方不明の単純な解決法、またはのが必要な状況があります。さらに、私は人々がについてについて話しているように、決してそれが必要でないかのように聞きます。これはどういう意味ですか?

改良できますか?それがあれば、解決策は何ですか?ありがとう。あなたはは、インデックスを追跡するコレクションを反復処理したい場合は

答えて

10

each_with_index使用:

fields = ["name", "age", "height"] 

fields.each_with_index do |field,i| 
    puts "#{i}. #{field}" # 0. name, 1. age, 2. height 
end 

あなたfor i in 0...size例は次のようになります。

array1.each_with_index do |item, i| 
    puts item 
    puts array2[size-1 - i] 
    puts i % 2 
end 
+0

'array1'と' array2'のサイズが同じであると仮定すると、 'array2 [-1 - i]'と書くと 'size'を計算する必要がなくなります。 – Borodin

3

あなたが行うことができます忘れないでくださいこのようなクールなものも

fields = ["name", "age", "height"] 

def output name, idx 
    puts "#{idx}. #{name}" 
end 

fields.each_with_index &method(:output) 
インスタンスメソッド

を使用して、クラスメソッド

print Printer, ["a", "b", "c"] 
# raw: a 
# raw: b 
# raw: c 

例を使用しますが、クラスやインスタンスメソッドとして、この技術を使用することができます

出力

0. name 
1. age 
2. height 

すぎ

class Printer 
    def self.output data 
    puts "raw: #{data}" 
    end 
end 

class Kanon < Printer 
    def initialize prefix 
    @prefix = prefix 
    end 
    def output data 
    puts "#{@prefix}: #{data}" 
    end 
end 

def print printer, data 
    # separating the block from `each` allows 
    # you to do interesting things 
    data.each &printer.method(:output) 
end 

kanon = Kanon.new "kanon prints pretty" 
print kanon, ["a", "b", "c"] 
# kanon prints pretty: a 
# kanon prints pretty: b 
# kanon prints pretty: c 
+0

あなたはできますが、どうしてですか?これは本当に何を追加しますか? – meagar

+0

ブロックを 'each *'反復から分離します。つまり、いつでもどこでもブロックすることができます。クラスやインスタンスメソッド、動的なprocなどがあります。ちょうどOPが比較的緑色のように見える柔軟性を実証するだけです。すでに+2を受け取ったので、私はこれも唯一のものだとは思わない。 – naomik

+0

私はそれが有用であることに同意しますが、それはそれを関連性や話題にしません。これは、質問が説明する状況では役に立ちません。 – meagar