我想创建一个过滤器,并能够将它应用于数组或散列。例如:
def isodd(i)
i % 2 == 1
end
我希望能够像这样使用它:
x = [1,2,3,4]
puts x.select(isodd)
x.delete_if(isodd)
puts x
这似乎应该是直截了当的,但我无法弄清楚我需要做什么让它发挥作用。
答案 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是一项繁重的操作(即使有了最新的改进),在某些情况下这样做可以减轻这种情况。