2013-07-21 2 views
0

Person 클래스가 있고 사람이 partner이라는 속성을 가지고 있다고 가정 해 보겠습니다. Person 개체 중 하나에서 partner=을 호출하면 두 개체의 @partner 인스턴스 변수를 설정하려고합니다. 여기에 잘못된 구문 예는 다음과 같습니다 가시성같은 클래스의 다른 객체에 인스턴스 변수 설정

업데이트 :

class Person 

    attr_reader :partner 

    def partner=(person) 

    # reset the old partner instance variable if it exists 
    [email protected] = nil if partner 

    # set the partner attributes 
    @partner = person 
    [email protected] = self 
    end 
end 

답변

0

신경 쓰지 마, 그냥 instance_variable_set을 발견했다. 다음과 같이

class Person 

    attr_reader :partner 

    def partner=(person) 

    # reset the old partner instance variable if it exists 
    partner.instance_variable_set(:@partner, nil) if partner 

    # set the partner attributes 
    @partner = person 
    person.instance_variable_set(:@partner, self) 
    end 
end 
+0

당신은 확실히 setter를 인스턴스에 대해 개인적으로 액세스 가능하게하려는 경우에는 확실히 변수의 getter와 setters 인스턴스에 액세스 할 수 있습니다. 당신의 경우에는, 당신이 원하는 것을 성취 할 수있는 더 좋은 방법이있을 것입니다. 나는이 문제에 대해 좀 더 명확하게 생각할 필요가 있다고 생각한다. –

2

변경 attr_accessor-attr_reader 및 도우미 메서드를 추가합니다. 아래 Frederick의 제안을 기반으로합니다. 이것은 좀 더 자세한하지만, 직접 설정되는 파트너를 방지 할 수 있습니다 :

class Person 
    protected 
    attr_writer :partner 

    public 
    attr_reader :partner 

    def link_partners(person) 
    @partner = person 
    person.partner = self 
    end 
end 

모두 구현은 다음과 같이 작동

p1, p2 = Person.new, Person.new 
p1.link_partners(p2) 
# p2.link_partners(p1) 
+0

:이 "외부", 호출 할 수 없기 때문에 수표와 균형의 모든 partner=의 구현에서 유지 될 수있다. 정교하게 제발 주시겠습니까? – LandonSchropp

+0

미안하지만, 정교하고 싶었지만 세터를 발견하기 전에 거기에 가지 않았습니다. –

+0

내 솔루션의 주된 문제점은 누구나 person.partner를 직접 호출 할 수 있으며 그 사람의 파트너 만 설정할 수 있다는 것입니다. –

0

이론적으로, 당신이 할 수 있습니다 :

def partner=(person) 
    @partner = person 
    person.instance_variable_set(:@partner, self) 
end 

그러나, 나는 마법가이 고려할 것입니다. (좋은 것은 아닙니다.) 대신 attr_readerattr_accessor으로 만들고 다른 방법을 써서 person 2 개를 'partner'으로 설정하십시오.

+0

나는 마술이라고 생각하지 않는다. 예상 할 수있는 행동이기 때문이다. 문서가 확실히 도움이 될 것입니다 :) – LandonSchropp

0

이 재귀 세트로 문제를 해결하고 솔루션보다 더 보이는 것

class Partner 
    attr_reader :partner 
    def set_partner(person, recursive = true) 
    # reset previous partner 
    @partner.set_partner(nil, false) if recursive && @partner 

    # set new partner 
    @partner = person 
    @partner.set_partner(self, false) if recursive 
    end 
    alias_method :partner=, :set_partner 
end 
1

당신은 실제 작업을 수행하기 위해 partner= 방법으로 호출되는 보호 도우미 메서드를 제공 할 수 있습니다. 나는 그게 내 문제를 어떻게 해결하는지 정말 모르겠어요

class Person 
    attr_reader :partner 

    def partner=(person) 
    @partner.set_partner(nil) if @partner 
    set_partner(person) 
    person.set_partner(self) if person 
    end 

    def set_partner(person) 
    @partner = person 
    end 

    protected :set_partner 
end 
관련 문제