Ruby块隐式变量

时间:2014-06-04 12:27:37

标签: ruby lambda block

我想知道Ruby是否像Scala中那样具有隐式块参数或通配符,可以绑定并用于进一步执行,如下所示:

my_collection.each { puts _ }

my_collection.each { puts }

像proc这样的符号会从集合中调用每个元素的一些方法,如:array_of_strings.each &:downcase,但我不想在循环中执行对象的方法,但是用这个对象作为参数执行一些函数:

my_collection.each { my_method(_) }

而不是:

my_collection.each { |f| my_method(f) }

有没有办法在Ruby中做到这一点?

1 个答案:

答案 0 :(得分:7)

您应该能够:

my_collection.each &method(:my_method)

method是在Object类上定义的方法,返回Method类的实例。 Method实例与符号类似,定义了to_proc方法,因此可以与一元&运算符一起使用。此运算符获取定义to_proc方法的proc或任何对象,并将其转换为块,然后将其传递给方法。因此,如果您有一个定义如下的方法:

def my_method(a,b)
  puts "#{b}: #{a}"
end

你可以写:

[1,2,3,4].each.with_index &:method(:my_method)

将转换为:

[1,2,3,4].each.with_index do |a,b|
  puts "#{b}: #{a}"
end