2010-05-21 2 views
0

간단한 배열 병합 메서드 을 작성하려고했지만 인스턴스 변수를 사용하여 작동하지 않습니다. 클래스 변수 만 사용하여 작동합니다. 아무도 그 이유를 말할 수 있습니까? 인스턴스 변수를 사용하여 작업을 수행하는 방법에 대해 설명합니다.배열 병합이 작동하지 않습니다 (인스턴스 변수 nil)

class Array 
@y = [] 
    def flatten_array 
    self.each do |x| 
    if x.class.to_s != 'Array' 
    @y << x 
    else 
    x.flatten_array 
    end 
    end 
    return @y 
    end 
end 


a = [1,2,3,4,5] 
b = [6,7,8] 
c = [9,10] 
a1 = [12,13,a,b,c] 
puts a1.inspect 
b1 = a1.flatten_array 
puts b1.inspect 
+0

궁금한 점 : 당신은 무엇을 성취하려고합니까? 이미'Array # flatten'이 있습니다 ... –

+0

왜 로컬 변수 대신에 인스턴스 변수를 사용하고 싶습니까? –

+0

제목에 "인스턴스"의 오타가 있습니다. –

답변

1

는 인스턴스 변수 작동하지 않는 이유는 x.flatten_array 새로운 @y이 아니라 당신이 축적 된 하나를 사용하고 있다는 점이다. 그러나이 방법으로 인스턴스 또는 클래스 변수를 사용하는 것은 로컬 함수에 전역 변수를 효과적으로 사용하기 때문에 좋지 않습니다. 연결 사용 기꺼이 단지

def flatten_array 
    int_flatten(self, []) 
end 

private 
def int_flatten(a, result) 
    a.each do |elem| 
    if (elem.is_a? Array) 
     int_flatten(elem, result) 
    else 
     result << elem 
    end 
    end 
    return result 
end 

나 :

추가 변수를 필요로하는 재귀 함수를 작성하기위한 표준 절차는 도우미 함수를 사용하는 것입니다

def flatten_array 
    result = [] 
    each do |elem| 
    if (elem.is_a? Array) 
     result += elem.flatten_array 
    else 
     result << elem 
    end 
    end 
    return result 
end 
+0

to : Marc-André Lafortune 방금 ​​Ruby를 더 잘 이해하기 위해 자체 array_flatten을 작성하려고했습니다. to : Andrew Grimm 제목의 오타를 지적 해 주셔서 감사합니다. 그러나, 그것은 내 질문에 대답하지 않았다. Kathy, 답장을 보내 주셔서 감사합니다. 로컬 변수가 작동하지 않을 수도 있지만 분명히 틀렸다고 생각했습니다. 두 코드 조각을 모두 시도했습니다. 두 번째는 효과가 없었고 처음에는 효과가 없었습니다. 아래를 봐주세요. – Nick

+0

Snippet1 : 데프 int_flatten flatten_array 클래스 Array (자기, []) 개인 데프 int_flatten 끝 (A, 결과) a.each 할 | ELEM | 경우 (elem.is_a? 배열) int_flatten (ELEM, 결과) 다른 결과 << ELEM 단부 단부 단부 단부 A = [1,2,3 [4,5,6 [7,8,9]] B = a.flatten_array b.inspect 둔다 출력 : [1, 2, 3, [4, 5, 6, [7, 8, 9] – Nick

+0

Snippet2 : 클래스 배열 def flatten_array result = [] 각 do | elem | 경우 (elem.is_a? 배열) 결과 + = elem.flatten_array 다른 결과 << ELEM 단부 단부 반환 결과 단부 단부 A = [1,2,3, [4, 5,6, [7,8,9]]] b = a.flatten_array puts b.검사 : 출력 : [1, 2, 3, 4, 5, 6, 7, 8,9] – Nick

0

사용을 기본 Array#flatten

a = [1,2,3,4,5] 
b = [6,7,8] 
c = [9,10] 
a1 = [12,13,a,b,c] 

puts a1.inspect 
#=> [12, 13, [1, 2, 3, 4, 5], [6, 7, 8], [9, 10]] 

puts a1.flatten.inspect 
#=> [12, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]