簡體   English   中英

NoMethodError:nil:NilClass的未定義方法“-”

[英]NoMethodError: undefined method `-' for nil: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代碼與array = [1,2,3]一起使用。 為什么它不能使用兩位數的數字?

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

您出錯的原因是這一行,

array[x-1] = x ** 2

每個方法都會針對自身中的每個元素調用給定的塊一次,並將該元素作為參數傳遞。 因此,當您使用[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工作原理的更多信息,請在此處查看

或者,您可以使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM