2016-08-01 15 views
0

配列の各要素を四角い配列に戻そうとしていますが、次のエラーが発生しますか?NoMethodError: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) 

ただし、2桁の数字の場合にのみ問題が発生します。次のRubyコードは配列= [1,2,3]で動作します。なぜ2桁の数字で動作しないのでしょうか?

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が返されます。

あなたは見hereを取る方法map作品についての詳細を知るためには、このようなmap

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

を使用してそれを行うことができます。

それとも、each_with_indexを使用することができ、

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

あなたが本当に唯一each私は.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.marimの新しいブランド –

関連する問題