Это синтаксис блока Ruby (имя Ruby для анонимной функции). И key
, value
- это не что иное, как аргументы, передаваемые анонимной функции.
Hash#each
принимает один параметр: функция, которая имеет 2 параметра, key
и value
.
Так что, если мы разобьем его на части, эта часть вашего кода: h.each
вызывает функцию each
для h
. И эта часть вашего кода:
do |key, value| # Iterate through the key/value pairs
print "#{value}:#{key}; " # Note variables substituted into string
end # Prints "1:one; 2:two; 3:three;
- это функция, передаваемая each
в качестве аргумента, а key
, value
- аргументы, передаваемые этой функции. Неважно, как вы их называете, первый ожидаемый аргумент - ключ , а второй ожидаемый аргумент - значение .
Давайте проведем некоторые аналогии. Рассмотрим основную функцию:
def name_of_function(arg1, arg1)
# Do stuff
end
# You'd call it such:
foo.name_of_function bar, baz # bar is becomes as arg1, baz becomes arg2
# As a block:
ooga = lambda { |arg1, arg2|
# Do stuff
}
# Note that this is exactly same as:
ooga = lambda do |arg1, arg2|
# Do stuff
end
# You would call it such:
ooga.call(bar, baz) # bar is becomes as arg1, baz becomes arg2
Таким образом, ваш код также может быть записан как:
print_key_value = lambda{|arg1, arg2| print "#{arg1}:#{arg2}"}
h = {
:one => 1,
:two => 2
}
h.each &print_key_value
Существует несколько способов выполнения кода внутри блока:
yield
yield key, value # This is one possible way in which Hash#each can use a block
yield item
block.call
block.call(key, value) # This is another way in which Hash#each can use a block
block.call(item)