Ruby 为什么reduce实现返回未定义的方法&x2B;对于nil:NilClass,一旦布尔检查返回true

Ruby 为什么reduce实现返回未定义的方法&x2B;对于nil:NilClass,一旦布尔检查返回true,ruby,Ruby,我需要找到所有数字的和,这些数字等于它们的数字的阶乘和。我有一个算法: def equal_to_sum_of_factorial_digits?(n) n == n.to_s.scan(/\d/).map{|s| s.to_i}.reduce{|acc,j| (j == 0 || j == 1) ? 1 : acc + (1..j).inject(:*)} end start = Time.now answer = (10..145).reduce {|acc,j| acc + j if

我需要找到所有数字的和,这些数字等于它们的数字的阶乘和。我有一个算法:

def equal_to_sum_of_factorial_digits?(n)
  n == n.to_s.scan(/\d/).map{|s| s.to_i}.reduce{|acc,j| (j == 0 || j == 1) ? 1 : acc + (1..j).inject(:*)}
end

start = Time.now
answer = (10..145).reduce {|acc,j| acc + j if equal_to_sum_of_factorial_digits?(j)}

puts "The answer is #{answer} and it took #{(Time.now-start)*1000} milliseconds."
在这里,
equal\u\u to\u sum\u of_factorial\u digits?
将一个数字变成独立的数字,然后如果它是
1
0
(1或0 factorial是1),或者如果它是
2
直到
9
,则加上值
1
。然后,答案对具有该属性的范围内的所有值求和

代码一直工作到我大于145为止(145是第一个值,它的属性是它等于它的阶乘数字之和:145=1!+4!+5!),它给出了nil:NilClass的错误
未定义方法“+”


我不知道为什么
answer=
之后的代码在
equal\u to\u sum\u factorial\u位?
方法返回
true
时失败。有人能告诉我吗?

这是因为在
reduce
的上一次迭代中,
acc
由于被计算为
nil
的块而一直是
nil
。请注意,
acc
的值是每个迭代块的评估值。

Oh当然。我必须保持
acc
如果因子数的和等于?返回false。这是有效的:
answer=(10..145)。将(0){acc,j |等于{u阶乘}位的{u和}acc+j:acc}
。谢谢!您不必异常地处理
j==1
情况。