2012-05-01 7 views
16

ルビのループeachの開始オフセットを設定するにはどうすればよいですか? ループをa[0]ではなくa[3]から開始します。どうすれば設定できますか?Ruby - 各開始オフセット

a = [ab, cd, ef, gh, hi, jk] 

a.each do |i| 
#some stuff 
end 

答えて

34

別、おそらくより直接的かつ可読性のある可能性は、Array#dropを使用することです:

a.drop(3).each do |i| 
    # do something with item i 
end 

Enumerableから継承した他のメソッドと組み合わせると、これは本当に輝きます。そのため、あなたの必須のeachループの代わりになる可能性があります。あなたが抽出されたスライスをフィルタリングし、その後、それを変換したいと言う:

a = [0,1,2,3,4,5,6,7] 
a.drop(3).select(&:even?).map { |x| x * 2 } 
# => [8, 12] 

それとも、すべての値のリストを印刷したいと言う:

a = ["1", "2", "3", "4", "5"] 
puts a.drop(3).join("\n") 

出力:

4 
5 

これらの関数型プログラミングから継承した機能は、Rubyを非常に強力にするものです:

+0

どのプログラミング言語がこのプログラミングスタイルに影響を与えましたか? – Vass

+1

@Vass LISP以降のHaskellでは、永続的な単一リンクリストに大いに依存しています。このスタイルはかなり一般的です(例えば、 'map'、' filter'、 'take'、' drop'、 'zip'あなたもRubyの 'Enumerable'モジュールにあります) –

+0

バイナリ検索や他のソートアルゴリズムを実装している間に、dropのようなさまざまなメソッドを見るのが良いでしょう。 – Donato

19

配列のsubparteachを使用してください。以下の例では、4番目の要素から最後まで:

a[3..-1].each do |i| 
    #some stuff 
end 
+0

a [a.size - 1] .each do | i | – JohnMerlino

4

これは

a[3..-1].each do |i| 
    #your logic 
end 
3

ほとんどRubyistのは、ループの古き良き忘れるあなたを助ける:

n = 3 
for i in n...a.size 
    puts a[i] 
end 
+4

新しいスコープを導入していないので、それは嫌です。これは 'do/end'を使用するので直感的ではありません。また、オペレーションは、インデックスではなく配列項目を列挙したいと考えました。 –

+0

ハァッ?それぞれdo/endも使用しますか?新しいスコープが必要な場合は、procクロージャを使用しないで、ループ内でメソッド呼び出しを使用してください。 forとeachのコードブロックの主義の違いがある場合、私はそれを知りたいと思います(私もループのために使用しません:) –

+1

とにかく、私はコードの代わりに[i]を追加しました。どうも。 –

関連する問題