在Ruby代码中,我注意到| |
之间放置了一些变量或其他对象。我不知道为什么。通常在哈希图中使用吗?
答案 0 :(得分:6)
这些是闭包(一个小的匿名函数)的参数。
my_method do |argument1, argument2|
puts argument1, argument2
end
|argument1, argument2|
表示需要两个参数。就像您编写方法一样,您会说def method(argument1, argument2)
。然后my_method
可以使用&
接受闭包,然后使用call
调用闭包。
def my_method(&block)
block.call(23, 42)
end
这是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
或者您可以使用yield
隐式调用该块,并且速度稍快。
def my_map(list)
list.each do |element|
yield element
end
end
方法可以检查是否通过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
当您需要采取措施(例如在工作完成后关闭文件或关闭连接)时,这非常有用
有关更多信息,请参见Block Arguments in the Ruby Docs。