NoMethodError:未定义的方法` - '代表nil:NilClass

时间:2016-08-01 02:44:10

标签: ruby-on-rails ruby rspec

我正在尝试返回一个数组,该数组对数组中的每个元素进行平方,但是我得到以下错误?

1) #square_array should square the elements in an array
     Failure/Error: expect(square_array([9,10,16,25])).to eq([81,100,256,625])

     NoMethodError:
       undefined method `-' for nil:NilClass
     # ./square_array.rb:3:in `block in square_array'
     # ./square_array.rb:2:in `each'
     # ./square_array.rb:2:in `square_array'
     # ./spec/square_array_spec.rb:19:in `block (2 levels) in <top (required)>'

Finished in 0.03363 seconds (files took 0.30161 seconds to load)

但是只有当两位数字时才会出现问题,以下Ruby代码使用数组= [1,2,3]。为什么它不能使用两位数字?

def square_array(array)
  array.each do |x|
      array[x-1] = x ** 2
  end
end

1 个答案:

答案 0 :(得分:1)

出错的原因是这一行,

array[x-1] = x ** 2

each方法为self中的每个元素调用给定的块一次,将该元素作为参数传递。所以当你使用[1,2,3]时,x-1返回0,1,2即可。但是当你使用[9,10,16,25]时,它返回8,9,15,24,这绝对不是数组索引。

您可以使用map这样做,

  def square_array(array)
    array.map{|x| x ** 2}
  end

要详细了解map的工作原理,请查看here

或者您可以使用each_with_index

  def square_array(array)
    array.each_with_index {|x, index| array[index] = x ** 2}
  end

如果你真的只想使用each(不推荐)

  def square_array(array)
    i = 0
    array.each do |x|
      array[i] = x ** 2
      i+=1
    end
  end