9

Ruby では、for ループを使用するスタイルは良くありません。これは一般的に理解されています。私に推奨されたスタイルガイド: ( https://github.com/bbatsov/ruby-style-guide#source-code-layout ) 言います:

「理由が正確にわからない限り、決して for を使用しないでください。ほとんどの場合、代わりにイテレータを使用する必要があります。 for はそれぞれの観点から実装されています (したがって、間接的なレベルを追加しています)。ただし、ひねりがあります - for は導入しません新しいスコープ (それぞれとは異なります) とそのブロックで定義された変数は、そのブロックの外側に表示されます。」

与えられた例は次のとおりです。

arr = [1, 2, 3]

#bad
for elem in arr do
  puts elem
end

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

調査しましたが、場所に渡したり演算を実行したりできる反復値を提供する for ループをシミュレートする方法についての説明が見つかりません。たとえば、次のように置き換えます。

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

配列が1つなら簡単ですが、別の目的で現在位置が必要になることがよくあります。私が見逃している簡単な解決策、またはforが必要な状況があります。さらに、人々はforがまったく必要ないかのように話しているのを耳にします。では、これに対する彼らの解決策は何ですか?

改善できますか?また、解決策がある場合、どのような解決策がありますか? ありがとう。

4

2 に答える 2

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
于 2013-08-13T17:06:43.043 に答える
3

このようなクールなこともできることを忘れないでください

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

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

fields.each_with_index &method(:output)

出力

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

クラスメソッドを使った例

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

インスタンスメソッドを使った例

kanon = Kanon.new "kanon prints pretty"
print kanon, ["a", "b", "c"]
# kanon prints pretty: a
# kanon prints pretty: b
# kanon prints pretty: c
于 2013-08-13T17:20:01.597 に答える