在Ruby中否定一个谓词Proc

时间:2013-11-04 11:56:58

标签: ruby

我有一个Proc,它是谓词。

Proc.new { |number| number.even? }

有没有办法以某种方式创建另一个具有相反含义的Proc?我不能改变Proc的“体”,因为Proc将作为函数参数。所以我想要这样的东西:

not(Proc.new { |number| number.even? }
# which of course doesn't work :(

我希望它和

一样
Proc.new { |number| number.odd? }

我的想法是我想要一个类似于此的函数:

def negate(proc)
  negated proc with meaning opposite of this of proc
end

非常感谢你!

2 个答案:

答案 0 :(得分:5)

以下方法返回与提供的过程相反的过程。

def negate(procedure)
  Proc.new { |*args| !procedure.call(*args) }
end

或者,使用较短的符号:

def negate(procedure)
  proc { |*args| !procedure.call(*args) }
end

答案 1 :(得分:1)

这有帮助吗?

p = Proc.new { |number| number.even? }
p.call(1) #=> false
!p.call(1) #=> true