0

私は簡単に反復と混同してしまいます - このコードが何をするのかを正確に説明してくれる人はいますか? 友人や家族はハッシュで、言語は Ruby です。

friends.each { |x| puts "#{x}" } 
family.each { |x, y| puts "#{x}: #{y}" }
4

2 に答える 2

4
friends.each { |x| puts "#{x}" } 
family.each { |x, y| puts "#{x}: #{y}" }

最初のものは、基本的に次のものと同等です。

x = [friends.keys[0], friends.values[0]]
puts "#{x}"
x = [friends.keys[1], friends.values[1]]
puts "#{x}"
x = [friends.keys[2], friends.values[2]]
puts "#{x}"
# ...
x = [friends.keys[n], friends.values[n]]
puts "#{x}"

二番目:

x = family.keys[0]
y = family.values[0]
puts "#{x}: #{y}"
x = family.keys[1]
y = family.values[1]
puts "#{x}: #{y}"
x = family.keys[2]
y = family.values[2]
puts "#{x}: #{y}"
# ...
x = family.keys[n]
y = family.values[n]
puts "#{x}: #{y}"

{ |...| ... }メソッドのようなものやメソッドの後にあるときはいつでもdo |...|; ...; end、ブロックと呼ばれるものを作成しています。このブロックはメソッドに渡されyield、ブロックにパラメーターを渡すことができます。Array#each各要素でブロックを呼び出します。Hash#each合格し[key, value]ます。

もちろん、次のようにまったく異なることを行うこともできます。

def test
  yield('oh my')
  yield('i really')
  yield('like blocks')
end
test { |a| puts a }

どの出力

oh my
i really
like blocks

配列をyieldブロックに割り当てると、複数または単一のパラメーターに割り当てることができます。

def test
  yield(['oh', 'my'])
  yield(['i', 'really'])
  yield(['like', 'blocks'])
end
test { |a, b| puts "#{a}-#{b}" }

どの出力

oh-my
i-really
like-blocks

または、ブロックで単一のパラメーターのみを受け入れる場合は、配列として渡されます

test { |a| puts a.inspect }

出力

["oh", "my"]
["i", "really"]
["like", "blocks"]

したがって、Array#eachが存在せず、自分で作成したいとします。次のようなことができます

class Array
  def each
    i = 0
    while i < length_of_underlying_array
      next_element = get_element(i)
      yield(next_element)
    end
  end
end

または、Hash#each

class Hash
  def each
    i = 0
    while i < length_of_underlying_hash
      next_key = keys[i]
      next_value = values[i]
      yield([next_key, next_value])
    end
  end
end

もう 1 つの一般的なヒントとして、Ruby はオープン ソースであるため、 Array#eachHash#eachが C でどのように実装されているかを正確に確認できます。これは通常、上記のプレーンな Ruby コードと一致します。

于 2013-05-19T16:34:18.070 に答える
3
  • が呼び出されると、ハッシュ{a: => :b, :c => :d}は配列[[:a, :b], [:c, :d]]にキャストされます。each
  • ブロック oneachが 1 つの variable を取る場合x、その各要素が渡されます。これは[:a, :b]最初の反復[:c, :d]用であり、次の反復用です。
  • ブロック onが とeachの 2 つの変数xを取る場合、y次のような各要素が[:a, :b]変数と一致します。最初の反復でx:a、とyなり:bます。
于 2013-05-19T16:28:07.927 に答える