2016-08-01 91 views
0

我想返回一个数组,该数组正方形上的每个元素,但是我得到以下错误?NoMethodError:未定义的方法' - '为零:NilClass

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

你的错误的原因是这样的线,

array[x-1] = x ** 2 

each该方法用于在自每个元素调用给定块一次,传递该元素作为参数。所以当你使用[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 
+0

我被要求使用。每个方法“实践遍历的数组使用.each方法。“ –

+0

非常感谢你的工作。 @ M.karim –

+0

我该如何接受它?即时消息品牌全新对此@ M.karim –

相关问题