对象作为方法的块参数

&(&符号)放在参数前面会将其作为方法的块传递。使用 to_proc 方法将对象转换为 Proc

class Greeter
  def to_proc
    Proc.new do |item|
      puts "Hello, #{item}"
    end
  end
end

greet = Greeter.new

%w(world life).each(&greet)

这是 Ruby 中的常见模式,许多标准类都提供它。

例如, Symbol 通过发送自己的参数来实现 to_proc

# Example implementation
class Symbol
  def to_proc
    Proc.new do |receiver|
      receiver.send self
    end
  end
end

这使得有用的 &:symbol 成语,通常与 Enumerable 对象一起使用:

letter_counts = %w(just some words).map(&:length)  # [4, 4, 5]