Ruby 切换谓词方法的高阶函数

Ruby 切换谓词方法的高阶函数,ruby,Ruby,有没有一种方法可以将谓词方法与接口结合起来进行切换 require 'prime' (1..10).select(&:prime?) # => [2, 3, 5, 7] # Toggling the prime? predicate? (1..10).select(not(&:prime?)) # SyntaxError: (irb):3: syntax error, unexpected &, expecting ')' 具体地说,我需要另一个谓词,如果所有

有没有一种方法可以将谓词方法与接口结合起来进行切换

require 'prime'

(1..10).select(&:prime?)
# => [2, 3, 5, 7]

# Toggling the prime? predicate?
(1..10).select(not(&:prime?))
# SyntaxError: (irb):3: syntax error, unexpected &, expecting ')'
具体地说,我需要另一个谓词,如果所有元素都不满足自定义谓词,则返回true

# concrete example
set.all?(not(:&custom_predicate?))
在您的情况下,可以使用以下方法:

(1..10).reject(&:prime?)
如果需要将自定义谓词与任意谓词组合切换?所有这些呢?方法,可以根据`:

任何?&:谓词?==!全部的{| obj |!obj.predicate?}

例如:

require 'prime'

(1..10).any?(&:prime?) == !(1..10).all? { |num| !num.prime? }
不,有两种方式:

使用拒绝

展开块

(1..10).select { |n| !n.prime? }

当然,只要实现你的否定器。不记得stdlib中是否存在这样的东西

require 'prime'

def nay(&proc)
  ->(obj) { !proc.call(obj) }  
end

puts (1..10).select(&nay(&:prime?))
# >> 1
# >> 4
# >> 6
# >> 8
# >> 9
# >> 10

不能在这里使用not这个词,它是一个关键字。

事实上,这完全可行,只需一点代码:哦,是的,当然。我的意思是没有现成的解决方案,我不太确定。Stdlib是huuuge,有许多黑暗的角落:我将我的评论转移到这个问题上,以使我的选择合理。
require 'prime'

def nay(&proc)
  ->(obj) { !proc.call(obj) }  
end

puts (1..10).select(&nay(&:prime?))
# >> 1
# >> 4
# >> 6
# >> 8
# >> 9
# >> 10