Array
-> |value,index|
とHash
-> |key,value|
が正気ではないと言っているわけではありませんが(Horace Loebのコメントを参照)、このアレンジメントを期待する正気な方法があると言っています。
配列を扱うときは、配列の要素に注目します(インデックスは一時的なため、インデックスではありません)。メソッドはそれぞれインデックス付きです。つまり、each + index、または| each、index |、または|value,index|
です。これは、オプションの引数として表示されるインデックスと一致します(例:|値|)。| value、index = nil |と同等です | value、index |と一致します。
私はハッシュを取り扱っております場合は、私は多くの場合、複数の値よりもキーに焦点を当てた、と私は通常、そのために、キーと値を扱っています、のいずれかkey => value
またはhash[key] = value
。
ダックタイピングが必要な場合は、Brent Longboroughが示すように定義されたメソッドを明示的に使用するか、maxhawkinsが示すように暗黙的なメソッドを使用します。
Rubyはすべて、プログラマーに合うように言語に対応することであり、言語に合うように対応するプログラマーではありません。これが、非常に多くの方法がある理由です。何かについて考える方法はたくさんあります。Rubyでは、最も近いものを選択し、残りのコードは通常、非常にきちんと簡潔に抜け落ちます。
元の質問「Rubyで配列を反復処理するための「正しい」方法は何ですか?」については、コアとなる方法(つまり、強力な構文糖やオブジェクト指向の力がない場合)は次のようにすることだと思います。
for index in 0 ... array.size
puts "array[#{index}] = #{array[index].inspect}"
end
しかし、Rubyはすべて、強力な構文上の砂糖とオブジェクト指向の力についてですが、いずれにしても、ここではハッシュと同等であり、キーを順序付けすることもしないこともできます。
for key in hash.keys.sort
puts "hash[#{key.inspect}] = #{hash[key].inspect}"
end
したがって、私の答えは、「Rubyで配列を反復処理する「正しい」方法は、ユーザー(つまり、プログラマーまたはプログラミングチーム)とプロジェクトによって異なります」です。より優れたRubyプログラマーは、より良い選択を行います(その構文的能力および/またはオブジェクト指向アプローチのいずれか)。より優れたRubyプログラマーは、より多くの方法を探し続けています。
ここで、「RubyでRangeを逆方向に反復する「正しい」方法は何ですか?」という別の質問をしたいと思います。(この質問は、私がこのページにアクセスした方法です。)
それは(フォワードのために)行うのがいいです:
(1..10).each{|i| puts "i=#{i}" }
しかし、私は(逆向きに)やりたくありません:
(1..10).to_a.reverse.each{|i| puts "i=#{i}" }
ええと、私は実際にそれをやりすぎてもかまいませんが、私は逆方向に教えるときに、生徒に良い対称性を示したいと思います(つまり、最小限の違いで、たとえば、リバースを追加するか、ステップ-1を追加しますが、その他の変更)。あなたは(対称性のために)することができます:
(a=*1..10).each{|i| puts "i=#{i}" }
そして
(a=*1..10).reverse.each{|i| puts "i=#{i}" }
私はあまり好きではありませんが、あなたはできません
(*1..10).each{|i| puts "i=#{i}" }
(*1..10).reverse.each{|i| puts "i=#{i}" }
#
(1..10).step(1){|i| puts "i=#{i}" }
(1..10).step(-1){|i| puts "i=#{i}" }
#
(1..10).each{|i| puts "i=#{i}" }
(10..1).each{|i| puts "i=#{i}" } # I don't want this though. It's dangerous
最終的には
class Range
def each_reverse(&block)
self.to_a.reverse.each(&block)
end
end
オブジェクト指向のアプローチではなく、純粋なRubyを教えたいと思っています(まだ)。私は逆方向に反復したいと思います:
- 配列を作成せず(0..1000000000を検討)
- 任意の範囲で機能する(例:整数だけでなく文字列)
- 追加のオブジェクト指向パワーを使用せずに(つまり、クラスの変更なし)
これは、pred
メソッドを定義しないと不可能だと思います。つまり、Rangeクラスを変更して、それを使用します。これができたら教えてください。そうでなければ、残念ですが不可能の確認をお願いします。おそらくRuby 1.9がこれに対処します。
(お読みいただきありがとうございます。)
array#each_with_index
する|value, key|
ので、私は使用を推測しますがhash#each
、hash[key] = value
構文を模倣するために使用される順序は?