2016-08-01 92 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 –

相關問題