2016-11-25 12 views
0

이 코드를 생각해 보자. 이 복제본을 새로운 클래스 ImmutableStructWithId으로 제거하고 싶습니다. 다음과 같이 그 새로운 클래스는 위의 2 개 라인을 다시 할 수 있도록합니다 : 루비의 초기화가 (그렇지 않은) 공장 기능처럼 일 초기화 프로그램에서 다른 객체의 생성자를 사용 하시겠습니까?</p> <pre><code>Campus = ImmutableStruct.new(:id, :name, :timezone) do def hash; id end end Merchant = ImmutableStruct.new(:id, :name, :campus) do def hash; id end end </code></pre> <p>을 주목 <code>hash</code> 방법의 중복 :

Campus = ImmutableStructWithId.new(:id, :name, :timezone) 
Merchant = ImmutableStructWithId.new(:id, :name, :campus) 

경우

는 다음과 같이 내가 원하는 것 무엇 :

를 초기화가되지 반환 그들이 만들고있는 객체을하기 때문에
class ImmutableStructWithId 
    def initialize(*args) 
    ImmutableStruct.new(*args) do 
     def hash; id end 
    end 
    end 
end 

내가, 위의 작동하지 않습니다 알고, 그들은 단지 이 초기화합니다. 그러나 이 공장 기능처럼 작업을 수행했다면 위의 내용을 수행하고 싶습니다.

루비에서 동일한 효과를 얻으려면 올바른 방법은 무엇입니까?

+0

는 또한, 내가 어떤 생성자 세부 사항을 볼 수 없습니다. 메소드 정의를 반복하지 않으려 고합니다. –

+0

수정하십시오. 궁극적으로 나는 해시 정의를 반복하지 않으려 고하고 구운 것을 가지고있는 특정 클래스를 사용하고 싶다. – Jonah

+0

장식 자/위임자. –

답변

4

IMO이 당신을 위해 작동합니다 :

require 'immutable-struct' 

module ImmutableStructWithId 
    def self.new(*args) 
    ImmutableStruct.new(*args) do 
     def hash; id; end 
    end 
    end 
end 

Campus = ImmutableStructWithId.new(:id, :name, :timezone) 
campus = Campus.new(id: '1', name: 'foo', timezone: 'UTC') 
#=> #<Campus:0x007f8ed581de20 @id="1", @name="foo", @timezone="UTC"> 
campus.hash 
#=> "1" 
+0

완벽 그런 식의 '새'를 다시 정의 할 수 있다는 것을 알지 못했습니다. 위 코드는'module'에서만 작동합니까? 즉, 여기에'class'를 사용하지 않은 이유가 있습니까? – Jonah

+0

모듈을 사용했는데, 인스턴스를 생성하고 싶지 않기 때문입니다. 이런 맥락에서'ImmutableStructWithIdFactory'라는 다른 이름을 생각해 볼 수 있습니다. – spickermann

+0

괜찮 았는데,'class'와 함께 작동합니다. – Jonah

관련 문제

 관련 문제