使用Ruby注入时的Nil类

Gre*_*les 7 ruby

我是Ruby的新手,我在使用inject方法时遇到了一个奇怪的问题.

当我做:

(1..10).inject(0) {|count,x| count + 1}
Run Code Online (Sandbox Code Playgroud)

结果是10,正如预期的那样.但是,当我这样做

(1..10).inject(0) {|count,x| count + 1 if (x%2 == 0)}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

NoMethodError: undefined method `+' for nil:NilClass
    from (irb):43
    from (irb):43:in `inject'
    from (irb):43:in `each'
    from (irb):43:in `inject'
    from (irb):43
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么(大概)计数在第二个例子中是零,但不是第一个.在任何情况下,我如何使用注入计算从1到10的均衡?

Jer*_*ten 14

当条件不为真时,表达式count + 1 if (x%2 == 0)返回nil,count设置为,因为这是inject方法的本质.

您可以通过count + 1在是偶数时返回来修复它,而count当它不是时:

(1..10).inject(0) { |count,x| x % 2 == 0 ? count + 1 : count }
Run Code Online (Sandbox Code Playgroud)

一种完全不同的解决方案是使用select选择偶数并使用该Array#length方法对它们进行计数.

(1..10).select { |x| x % 2 == 0 }.length
Run Code Online (Sandbox Code Playgroud)