【问题标题】:undefined method `even?' for nil:NilClass using injection未定义的方法“甚至?”对于 nil:NilClass 使用注入
【发布时间】:2020-07-20 02:29:08
【问题描述】:

我是 Ruby 新手,我很难找出这个错误。

当我这样做时:

ary = [0,1,1,2,3,5,8,13,21,34,55,89,144]

ary.inject {|mem, i| mem + i if mem.even? && i.even? }

这个错误出来了:

NoMethodError (undefined method `even?' for nil:NilClass)

我只想数对(偶)数。

【问题讨论】:

  • 您只想添加偶数?
  • 这也可以通过array.select(&:even).reduce(:+)完成
  • @steenslag 我忽略了这一点。感谢您指出。

标签: ruby inject


【解决方案1】:

快速查看#inject 在传递块时的作用:第一次迭代它在第一个块参数mem 中传递数组的第一个元素 (0)。它从那里“累积”结果,总是将块传递给块块上次返回的结果

当你看你的块时:

ary.inject { |mem, i| mem + i if mem.even? && i.even? }

满足条件时,您将返回mem + i。但是,当条件不满足时,您将隐式返回 nil。因此,在下一次迭代中,memnil,你就会得到错误。您可能想要一个三元运算符:

ary.inject { |mem, i| i.even? ? mem + i : mem }

【讨论】:

  • 您只需要i.even?,因为mem 将永远是偶数。
  • @Stefan ary.inject(0) { |mem, i| i.even? ? mem + i : mem } 处理一个奇怪的第一个元素。 .
猜你喜欢
  • 2014-06-09
  • 2015-12-09
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多