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

时间:2009-08-28 15:01:42

标签: ruby

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

def isodd(i)
  i % 2 == 1
end

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

x = [1,2,3,4]
puts x.select(isodd)
x.delete_if(isodd)
puts x

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

4 个答案:

答案 0 :(得分:73)

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

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

答案 1 :(得分:31)

puts x.select(&method(:isodd))

答案 2 :(得分:20)

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

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

&运算符会在Proc / lambda和一个块之间进行转换,这就像select这样的方法。

答案 3 :(得分:0)

如果您在实例中使用它,并且不需要proc范围之外的任何其他变量(正在使用proc的方法中的其他变量),则可以将其设为冻结常量,例如所以:

ISODD = -> (i) { i % 2 == 1 }.freeze
x = [1,2,3,4]
x.select(&ISODD)

在Ruby中创建proc是一项繁重的操作(即使有了最新的改进),在某些情况下这样做可以减轻这种情况。