我是红宝石的新手。我使用了很多允许高阶函数的 C# 和 JavaScript,而且我通常每天都使用它们。
Ruby 对我来说似乎有点奇怪。一个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
呢?