2010-07-30 4 views
3

체인 방식으로 사용할 때 '< <'을 동일한 동작으로 구현하려면 어떻게해야합니까?루비 체인 방식/배열

class Test 
    attr_accessor :internal_array 

    def initialize 
    @internal_array = [] 
    end 

    def <<(item) 
    @internal_array << :a 
    @internal_array << item 
    end 
end 

t = Test.new 
t << 1 
t << 2 
t << 3 
#t.internal_array => [:a, 1, :a, 2, :a, 3] 
puts "#{t.internal_array}" # => a1a2a3 

t = Test.new 
t << 1 << 2 << 3 
#t.internal_array => [:a, 1, 2, 3] 
puts "#{t.internal_array}" # => a123 , Why not a1a2a3? 

두 경우 모두 동일한 결과를 얻길 원합니다.

답변

4

< < 메서드의 마지막 줄에 self을 추가하면 반환됩니다. 즉, 인스턴스가 아니라 배열을 암시 적으로 반환합니다. 상기 응답의

0

설명 : 방법은 체인 경우

다음 방법은 첫 번째 방법의 결과에 적용된다.

exemplo를 들어

:

class A 
    def method1 
    B.new 
    end 
end 

class B 
    def method2 
    C.new 
    end 
end 

class C 
    def method3 
    puts "It is working!!!" 
    end 
end 

아래 코드는

A.new.method1.method2.method3 

작동하지만 것이

A.new.method1.method3.method2 

하지 않기 때문의 결과 클래스 B의 인스턴스 A.new.method1은 method3을 구현하지 않습니다. 이 같은입니다 : 위의 질문에 사용

(((A.new).method1).method3).method2 

코드, 조금 더 트릭은 모두 있기 때문에, 테스트 및 배열이 방법 < <했다이었다. 하지만 Test # < <은 반환되는 @internal_array가 아닌 self를 반환하기를 원합니다.

+0

귀하의 질문에 대한 답변이 맞습니까? 나는 혼란스러워. – Chuck

+0

위의 대답에 대한 설명입니다. 짧은 대답은 Matthew에 의해 주어졌다. – Portela