2014-03-28 1 views
0

예를 들어, 나는 단지 Parent 클래스의 인스턴스가 Child 클래스의 @name을 변경할 수 있도록하려면이Ruby에서 다른 지정된 클래스에 대한 보호 된 메서드에 대한 액세스 권한을 부여 할 수 있습니까?

class Child 
    @name = "Bastion, please, call my name!" 
    attr_reader :name 
end 

class Parent 
    @name = "I am a parent" 
    def rename_child(child,name) 
    child.name = name 
    end 
end 

bastion = Parent.new() 
princess = Child.new() 

bastion.rename_child(princess,"Moon Child") 

같은 일을하고 싶습니다.

편집

나는 단지 Parent 클래스의 인스턴스가 Child예를@name 변경할 수 있도록합니다.

답변

1

난 당신이 인스턴스 변수보다는 클래스 인스턴스 하나가 될 @name에 대한 의미 있으리라 믿고있어 ... 당신은 #send를 사용하여이 작업을 수행 할 수 있습니다

class Child 
    def initialize 
    @name = "Bastion, please, call my name!" 
    end 
    attr_reader :name 
    private 
    attr_writer :name 
end 

class Parent 
    def initialize 
    @name = "I am a parent" 
    end 
    def rename_child(child, name) 
    child.send(:name=, name) 
    end 
end 

bastion, princess = Parent.new, Child.new 

p princess.name 
#=> "Bastion, please, call my name!" 

bastion.rename_child(princess, "Moon Child") 

p princess.name 
#=> "Moon Child" 
0

아니요. 그렇게 할 수 없습니다. 문제는 사적인 방법이 아닙니다. 인스턴스에 정의 된 접근 자에 의해 클래스 인스턴스 변수에 액세스 할 수 없습니다.

0

이것은 유감스럽게도 불가능합니다. 당신이 얻을 수있는 가장 가까운입니다 instance_variable_set이 함께 eval가 다른 언어로 그렇게 엄격하지 루비의 공개/비공개 차이를 만드는 공공 방법이다

class Child 
    @name = "Bastion, please, call my name!" 
    attr_reader :name 
end 

class Parent 
    @name = "I am a parent" 
    def rename_child(child,name) 
    child.instance_variable_set(:@name, name) 
    end 
end 

하는 것으로. 이러한 방법은 매우 신중하게 사용해야하며 일반적으로 약간 '해킹'으로 간주됩니다. 내 직감이 맞다면