2017-12-18 1 views
-2

나는 함수로 배열의 숫자 합계를 시도하고있다 :어떻게 배열에 숫자를 합계하는

def total(numbers) 
numbers.each do |e| 
    total_number = e + total_number 
    return total_number 
end 
end 

puts total([1,2,3,4]) 

하지만라는 오류 메시지가 계속 :

전무을 할 수 없습니다 Fixnum (repl)으로 강요 받아야합니다 : 18 : + '

내가 잘못하고있는 것을 누구든지 볼 수 있습니까?

각> do 루프는 함수 외부에서 작동합니다.

numbers.sum 

numbers.inject(:+) 

그리고 많은 다른 사람 :

+2

'total_number'는 처음에는'nil'이므로'total_number = e + nil'이됩니다. 그리고 아마도 루프 안에서 돌아가고 싶지 않을 것입니다. – Stefan

답변

5

) docs 다음 번 확인 부끄러워하지 말고 배열의 inbuilt 메소드.

array = [1, 2, 3, 4] 
total_number = array.inject(:+) 
+1

처음에는 잘못되었지만이 대답에서 수정 된 또 다른 사항은 return 문 위치입니다. 그것은 루프에 있었으므로 첫 번째 반복에서 함수가 반환되어 배열의 첫 번째 숫자 만 반환됩니다. –

+3

여기에'return'이 필요 없습니다. –

+0

@AlexGolubenko가이 작업을 수행 할 수있는 적절한 접근법을 가지고 있다고 말하지만, 이렇게하면 문제가 해결 될 것입니다. 휠을 재발 명할 필요는 없지만 사소한 방법 일 수 있습니다. – SRack

5

는 여러 가지를 할 수있는 방법이 있습니다. 당신이 그 오류를주고있다, 그래서이

def total(numbers) 
total_number = 0 
numbers.each do |e| 
    total_number += e # Same as your total_number = e + total_number 
end 
return total_number 
end 

puts total([1,2,3,4]) 

그러나 가장 좋은 방법은 루비를 사용하는 것을 시도해보십시오 total_number 변수를 초기화하지 않은

+0

@Stefan 확실한 방법 리팩토링의 가능한 변형에 대해 생각하고있는 동안 나는 편집에 늦었다. –

+0

어쩌면 당신은 OP의 메소드를 'each'에서 외부 카운터로 'inject'하는 블록으로'inject'하는 방법을 보여 줄 수있다. '단지': + '를'sum'으로 사용합니다. – Stefan

관련 문제