我有一个注射电话
[2,4,6].inject(true) { |res, val| res && val % 2 == 0 }
Run Code Online (Sandbox Code Playgroud)
并希望发送&&操作员注入inject(0, :+).我怎样才能做到这一点?
tor*_*o2k 12
你不能因为&&和||其他运算符一样,不是方法的合成糖(即没有方法称为&&或||),所以你不能用符号引用它们.
但是,您可以避免使用inject计算布尔值数组的逻辑连接或析取,分别用all?或替换它any?,因为对于任何数组,以下条件成立:
ary.inject(true) { |res, b| res && b } == ary.all?
ary.inject(false) { |res, b| res || b } == ary.any?
Run Code Online (Sandbox Code Playgroud)
因此,例如,您发布的代码可以重写为:
[2,4,6].map(&:even?).all?
# => true
Run Code Online (Sandbox Code Playgroud)
更新:显然我的后一个例子不是表达这个计算的正确方法,falsetru的答案要快得多:
require 'fruity'
compare(
-> { (0..1000).map(&:even?).all? },
-> { (0..1000).all?(&:even?) }
)
Run Code Online (Sandbox Code Playgroud)
Running each test 1024 times. Test will take about 2 seconds.
Code 2 is faster than Code 1 by 111x ± 10.0
Run Code Online (Sandbox Code Playgroud)
如何使用 Enumerable#all?
[2,4,6].all? &:even?
# => true
[2,4,6,5].all? &:even?
# => false
Run Code Online (Sandbox Code Playgroud)
如果要使用inject,则需要定义实例方法.
class Object
def is_even(val)
self && val % 2 == 0
end
end
[2,4,6].inject(true, :is_even) # => true
[1,2,4,6,5].inject(true, :is_even) # => false
Run Code Online (Sandbox Code Playgroud)