2016-08-01 6 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) 

하지만 두 자리 숫자 일 때만 문제가 발생합니다. 다음 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 내가 .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에 –

관련 문제