私は簡単に反復と混同してしまいます - このコードが何をするのかを正確に説明してくれる人はいますか? 友人や家族はハッシュで、言語は Ruby です。
friends.each { |x| puts "#{x}" }
family.each { |x, y| puts "#{x}: #{y}" }
私は簡単に反復と混同してしまいます - このコードが何をするのかを正確に説明してくれる人はいますか? 友人や家族はハッシュで、言語は Ruby です。
friends.each { |x| puts "#{x}" }
family.each { |x, y| puts "#{x}: #{y}" }
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#eachとHash#eachが C でどのように実装されているかを正確に確認できます。これは通常、上記のプレーンな Ruby コードと一致します。
{a: => :b, :c => :d}
は配列[[:a, :b], [:c, :d]]
にキャストされます。each
each
が 1 つの variable を取る場合x
、その各要素が渡されます。これは[:a, :b]
最初の反復[:c, :d]
用であり、次の反復用です。each
の 2 つの変数x
を取る場合、y
次のような各要素が[:a, :b]
変数と一致します。最初の反復でx
は:a
、とy
なり:b
ます。