2014-04-27 4 views
-1

두 배열 항목의 차이점을 찾으려고합니다. 예를 들어 [-1, -4], [-2, 4], [1, -2][arr[i],arr[i+1]].transpose.map{|x| x.reduce(:-)} 일 것으로 예상됩니다. 하지만 'transpose'오류가 발생합니다 : nil을 Array (TypeError)로 암시 적으로 변환하지 않습니다.Ruby에서 배열 항목의 차이를 찾는 방법

myarr =[] 
i=0 
arr = [[1,1],[2,5],[4,1],[3,3]] 
while i < arr.length 
    myarr = [arr[i],arr[i+1]].transpose.map{|x| x.reduce(:-)}.dosomething 
    i += 1 
end 

def dosomething 
... 
end 

여기서 내가 뭘 잘못하고 있니? Ruby를 처음 사용했습니다.

+2

루프 난'에 실행 = = arr.length-1'이지만 내부에서'arr [i + 1]'을하면 인덱스가 범위를 벗어 났으므로'nil'이됩니다. –

+0

'[] .dosomething'은 다른 * 정의되지 않은 method * 오류를 일으킬 것입니다. 당신은'module Enumerable; def dosomething() ...; 종료; 'dosomething [] .transpose.map {...}'(이것은'dosomething '을위한 매개 변수를 필요로합니다.) 결과로'dosomething'을 호출하십시오. – DMKE

답변

3

당신은 each_cons을 시도 할 수 있습니다 :

arr = [[1,1],[2,5],[4,1],[3,3]] 

def dosomething(myarr) 
    puts myarr.to_s 
end 

arr.each_cons(2) do |pairs| 
    myarr = pairs.transpose.map{|x| x.reduce(:-)} 
    dosomething(myarr) 
end 
# [-1, -4] 
# [-2, 4] 
# [1, -2] 
0

또 다른 방법을 do_something에 대한 인수를 계산하는 것은 사용하는 것이다 루비의 Matrix 클래스와 Array#zip :

require 'matrix' 

arr = [[1,1],[2,5],[4,1],[3,3]] 

diff = arr[0..-2].zip(arr.drop(1)).map { |a,b| (Matrix[a] - Matrix[b]).to_a } 
    #=> [[[-1, -4]], [[-2, 4]], [[1, -2]]] 
관련 문제