这段代码中的NilClass在哪里? (项目欧拉#8)

时间:2014-03-05 03:33:06

标签: ruby inject

在检查其他人的解决方案后,我的代码似乎与正确答案非常相似。我认为唯一的区别是我定义ab的方式。出于某种原因,它说他们都在NilClass ......?

def product(num)
  i = 0
  j = 4
  arr = num.to_s.scan(/d/).map {|e| e.to_i} #can use .split('') vs .scan
  a = (arr[i]..arr[j]).inject(:*) # vs (1) {|product, n| product * n}

  while j <= arr.length
    b = (arr[i+1]..arr[j+1]).inject(:*)

    a = b if b > a 
    i+=1
    j+=1 
  end
  puts a
end

2 个答案:

答案 0 :(得分:3)

正则表达式文字/d/d完全匹配。

如果您想匹配数字,则应使用\d代替。

否则,没有匹配; arr成为一个空数组。索引空数组总是产生nil

arr = []
arr[0] # => nil

答案 1 :(得分:0)

您也遇到阵列索引问题。数组arr的最后一个索引是arr.length - 1。但是你的代码:

while j <= arr.length b = (arr[i+1]..arr[j+1]).inject(:*)

尝试访问数组,直到索引arr.length + 1