1

ここでの詳細は重要ではありません。これは単なる例です。重要なのは i=0, i+=1 アクションだけです

def sortAndIndex
  #sorting keys
  @disco = Hash[@disco.sort]

  #basic setup for both input types
  @years = @disco.keys
  @albums = @disco.values
  sum = @years.count

  #setup for "albums" input
  @allalbums = []
  i = 0
  sum.times do
  thatyear = @years[i] + ", " + @albums[i]
  @allalbums << thatyear
  i += 1
 end
end

これは、ルビーや他のほとんどの言語の他の「i++」型 (「C スタイル」) イテレータと同様に機能します。ただし、Ruby にはこれを行うためのこのより良い方法があると聞いています。基本的には、ここでは「a」以外の 2 番目のパラメーター変数を渡します。

これを行うにはどのような変更を加える必要がありますか?これらの種類の i++ ary[i] イテレータの問題を含む ruby​​ の複数の「ショートカット」はありますか?

4

3 に答える 3

3

はい、「Ruby のやり方」で物事を行い、インデックス作成を忘れるべきです。なんで?それは慣用的で、より見栄えがするからです。コレクションの各要素に対して実行されるコードのブロックを渡します。要素がどのように格納されるか、どのような順序でインデックスを作成できるかは、すべて無関係です。

# nice, eh?
some_array.each do |elem|
  some_action(elem)
end

インデックス カウンターが必要な場合 (この例では必要ありません)、each_with_index代わりに使用してください。

また、Ruby では、コレクションの繰り返し以外にも、ブロックの概念が重要であることに注意してください。あなたが持っているものは...奇妙です...そしてそれらに耳を傾けるべきですが、多くのメソッドはブロックを引数(またはオプションの引数)として受け取り、インデックス付けできるコレクションを返しません。たとえばFile.open、ブロックを受け取り、指定されている場合は、ブロックが返されたときにファイルを閉じます

また、もう 1 つ注意すべき点があります。あなたの命名規則はRubyでは一般的ではありません。Rubyist は、小文字の関数名と変数名をunderscores_between_words. ここのコミュニティに固執するのが最善です。

于 2012-07-09T21:53:39.893 に答える
1

人々はこれについてあなたに話している:

ary.each do |a|
  puts a
end

ずっと簡単ですね。

アップデート

これは私があなたの更新された例を慣用的なルビーで書く方法です

def sort_and_index
  @disco.sort.map do |year, album|
    "#{year}, #{album}"
  end
end

後で使用するためにこれらすべてのインスタンス変数が必要かどうかはわかりません。

于 2012-07-09T21:49:54.190 に答える
0

メソッドは 2 番目のtimes引数をブロックに渡しません。each_with_indexオブジェクトとそのオブジェクトのインデックスをブロックに渡す を探しているかもしれません:

ary.each_with_index do |object, i|
  puts "Index #{i} => #{object.inspect}"
end

しかし最終的にはい、Ruby にはコレクションを反復処理する方法がいくつかあり、それらはすべて C スタイルのforループよりも優れています :-)

于 2012-07-09T21:53:25.207 に答える