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

Dom*_*ndo -4 ruby variables

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

Sch*_*ern 6

这些是一个闭包的参数,一个小的匿名函数.

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.