将变量放在|之间|在Ruby中

时间:2018-10-10 22:06:27

标签: ruby variables

在Ruby代码中,我注意到| |之间放置了一些变量或其他对象。我不知道为什么。通常在哈希图中使用吗?

1 个答案:

答案 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