这些是一个闭包的参数,一个小的匿名函数.
my_method do |argument1, argument2|
puts argument1, argument2
end
Run Code Online (Sandbox Code Playgroud)
|argument1, argument2|说这需要两个论点.就像你写了一个你会说的方法一样def method(argument1, argument2).然后my_method可以接受封闭使用&并使用它来调用它call.
def my_method(&block)
block.call(23, 42)
end
Run Code Online (Sandbox Code Playgroud)
这就是Ruby做迭代器的方式.例如,以下是您的实施方式map.
def my_map(list, &block)
list.each do |element|
block.call(element)
end
end
my_map([23, 42, 99]) do |element|
puts element
end
Run Code Online (Sandbox Code Playgroud)
或者你可以使用yield哪个隐式调用块,它稍微快一些.
def my_map(list)
list.each do |element|
yield element
end
end
Run Code Online (Sandbox Code Playgroud)
方法可以检查是否传入了块block_given?.例如,这File.open可以返回一个打开的文件句柄,或者它可以将它提供给一个块并在块完成时关闭它.
def open(filename, mode='r')
file = File.new(filename, mode)
if block_given?
yield file
file.close
else
file
end
end
# open foo.txt
puts open("foo.txt")
# open foo.txt, execute the block, and close it
open("foo.txt") do |file|
puts file.read
end
Run Code Online (Sandbox Code Playgroud)
这对于您需要采取措施非常有用,例如关闭文件或关闭连接,一旦完成工作,
有关更多信息,请参阅Ruby Docs中的Block Arguments.
| 归档时间: |
|
| 查看次数: |
57 次 |
| 最近记录: |