如何在Ruby中创建可重用的块/ proc/lambda?

bri*_*gge 49 ruby

我想创建一个过滤器,并能够将其应用于数组或散列.例如:

def isodd(i)
  i % 2 == 1
end
Run Code Online (Sandbox Code Playgroud)

我希望能够像这样使用它:

x = [1,2,3,4]
puts x.select(isodd)
x.delete_if(isodd)
puts x
Run Code Online (Sandbox Code Playgroud)

这似乎应该是直截了当的,但我无法弄清楚我需要做什么才能让它发挥作用.

Dav*_*Ray 73

创建一个lambda,然后使用&运算符转换为块:

isodd = lambda { |i| i % 2 == 1 }
[1,2,3,4].select(&isodd)
Run Code Online (Sandbox Code Playgroud)

  • 您也可以使用"stabby lambda"运算符来创建独立的proc.请参见http://stackoverflow.com/questions/9340117/what-is-the-stab-operator-in-ruby.可用于'ruby 1.9`.当然,纯粹是品味和编码风格的问题:) (5认同)

Ant*_*nen 31

puts x.select(&method(:isodd))
Run Code Online (Sandbox Code Playgroud)

  • +1当您有一个不想重写为lambda/proc的现有方法时,答案很有用.如果需要在特定对象上调用该方法,它也可以工作:`x.select(&obj.method(:isodd))` (2认同)

Dan*_*uis 20

您可以创建一个named Proc并将其传递给采用块的方法:

isodd = Proc.new { |i| i % 2 == 1 }
x = [1,2,3,4]
x.select(&isodd) # returns [1,3]
Run Code Online (Sandbox Code Playgroud)

&运营商之间进行转换Proc/ lambda和块,这是方法像什么select期望.