Я новичок в Ruby. Я использовал много С# и JavaScript, которые позволяют выполнять функции более высокого порядка, и я обычно использую их ежедневно.
Руби кажется мне немного странным. Функцияeach
может выглядеть так:
def each
@items.each do |item|
yield(item)
end
end
items.each { |item| puts item }
Тем не менее Ruby также имеет некоторую поддержку функций более высокого порядка. Вышеупомянутое может быть переписано на что-то вроде:
def each(proc)
@items.each do |item|
proc.call item
end
end
items.each -> (item) { puts item } # Or...
items.each lambda { |item| puts item }
Или даже:
def each(&proc)
@items.each do |item|
proc.call item
end
end
# No difference in syntax.
items.each { |item| puts item }
Это больше похоже на большинство других языков, и это всего лишь несколько символов дольше. Вместо явного прохождения в блоке все, кажется, использует yield
.
yield
кажется сумасшедшим, волшебным и таинственным. В конце концов, он переходит к началу вызова и захватывает блок сразу после вызова. Это кажется странным и неестественным, и я не знаю ни одной параллели этой функции на другом языке.
Итак, что сделка с yield
?