2013-07-13 19 views
0

배열처럼 작동하는 클래스를 디자인하고 싶습니다. 그러나 한 세트의 데이터를 다른 세트와 분리하여 특정 작업이 다른 집합입니다. 이것을하는 좋은 방법은 무엇입니까?다른 소스의 데이터를 가져 오는 사용자 정의 배열 유형 객체

내 디자인은 데이터의 초기 집합을 하나의 배열에 저장하고이 개체에 추가되는 모든 새 요소를 다른 배열에서 별도로 추적 ("추가"데이터라고 함)합니다.

이 클래스의 개체에서 항목을 추가하고 삭제하면 새 요소 만 작동하며 모든 요소는 초기 요소와 새 요소의 조합에 대해 수행됩니다.

이 개체의 요소 색인은 두 배열을 연결 한 요소의 색인이므로 초기 데이터에 3 개의 요소가 있고 여분의 배열에 4 개의 요소가있는 경우 추가 배열의 첫 번째 요소가 반환됩니다 초기 배열의 첫 번째 요소는 그림을 위해 0

의 인덱스를 반환하면서 3의 인덱스이는

class MyClass 

    def initialize(base_data) 
    @base_elements = base_data # this is an array 
    @extra_elements = []  # this stores the "new" data 
    end 

    def add(elem) 
    @extra_elements << elem 
    end 

    def delete(elem) 
    @extra_elements << elem 
    end 

    def all_elements 
    @base_elements.concat(@extra_elements) 
    end 

    def find(elem) 
    all_elements.find(...) 
    end 

    def index (elem) 
    all_elements.index(...) 
    end 
end 

이상적으로, 이것은 모두를 지원해야 코드에서 볼 수있는 방법입니다 Enumerator에 정의 된 방법, 예컨대 each, inject

답변

0

당신입니다 거의 거기에 따라 당신이 단지 몇 가지 수정을 요구하고 :

class MyClass 
    include Enumerable 

    def initialize(base_data) 
    @base_elements = base_data # this is an array 
    @extra_elements = []  # this stores the "new" data 
    end 

    def add(elem) 
    @extra_elements << elem 
    end 

    def delete(elem) 
    @extra_elements.delete(elem) 
    end 

    def all_elements 
    @base_elements.concat(@extra_elements) 
    end 

    def index (elem) 
    all_elements.index(...) 
    end 

    def each(&block) 
    all_elements.each(&block) 
    end 
end 
+0

내가 그러나 내가 만약 내가 그때 할 수 확실하지 않다, 열거 가능한 모듈을 포함하여 생각하고 있었는데 서로 다른 메소드를 모두 오버라이드하지 않고 열거 형으로 처리하여 두 배열을 처리하도록합니다. – MxyL

+1

'Enumerable'은'each' 메소드의 관점에서 다양한 메소드를 정의합니다. Alex는'all_elements'를 사용하는'each' 메소드를 정의 했으므로,'Enumerable' 메소드는 모두'all_elements'를 사용합니다. – georgebrock

관련 문제