2012-05-09 2 views
3

한 객체에서 다른 객체로 인스턴스 변수를 어떻게 추가 할 수 있습니까?Ruby : 객체에 인스턴스 변수 추가

예를 들어 기본 로봇이 있고 추가 기능을 사용하여 사용자 정의 할 수있는 로봇을 상상해보십시오.

 
class Robot 

    def initialize 
     @name = "simple robot" 
     @power = nil #no power 
     @speed = nil 
     # more attributes 
    end 

    def add_attributes(addon) 
     @power = addon.power 
     @speed = addon.speed 
     #the rest of the attributes that addon has 
    end 
end 

내가 속성의 수십있을 수 원인이 단순히 그들에게 한 모든 일을 작성하는 대신 부가 기능의 각 속성을 반복하는 다시 쓰기 add_attributes 방법에 싶습니다.

일부 애드온에는 Robot에없는 인스턴스 변수가있을 수 있으며 Robot에도 추가하고 싶습니다. 즉석에서 인스턴스 변수를 생성하는 것과 같은 것입니까?

답변

7

"속성"의 의미에 달려 있습니다. 루비는 바로 그 개념을 가지고 있지 않지만 같은 다른 하나의 개체에서 인스턴스 변수를 복사 할 수 다음 answer by @HolgerJust도 좋은 해결책이

def add_attributes(addon) 
    addon.instance_variables.each do |x| 
    self.instance_variable_set(addon.instance_variable_get(x)) 
    end  
end 

[편집] 참고.

+0

난 정말이 같은 부가 기능의 인스턴스 변수 들여다 보며 마음에 들지 않습니다. 애드온은 실제로 속성 목록을 가져 오는 통일 된 방법을 제공해야하며, 그 방법은 그 속성에 대해 호출 될 수 있습니다. 물론 주어진 정보를 가지고 있으면 가장 좋은 해결책 일 것입니다. –

5

인스턴스 변수를 제거하고 대신 단일 해시를 사용할 수 있습니다. 이렇게하면 무료 열거 자와 로봇이 편리한 장소에서 가지고있는 모든 기능에 액세스 할 수있는 깨끗한 인터페이스가 있다는 장점이 있습니다.

또한 인스턴스 내부 변수를 혼동하지 않아도됩니다. 그들은 일반적으로 내부 용으로 설계되어 방대한 양의 물건에 사용됩니다. 기능을 공개하려면 공개 메소드로 수행해야합니다. 내부 상태를 망치는 것은 적어도 나쁜 디자인이며 나중에는 많은 슬픔을 낳을 것입니다. 일반적으로 가능하면 메타 프로그래밍을 피하는 것이 좋습니다.

class Robot 
    attr_reader :features 

    def initialize 
    @features = {} 
    @features[:name] = "simple robot" 
    @features[:power] = nil #no power 
    @features[:speed] = nil 
    end 

    def add_attributes(addon) 
    @features.merge! addon.features 
    end 
end 
+1

[Hash # merge] (http://www.ruby-doc.org/core-1.9.3/Hash.html#method)를 사용하십시오. -i-merge) 대신'addon' 매개 변수를 반복하면'add_attributes' 메쏘드가 정리됩니다. – Cade

+0

@Cade : 물론. 편집 됨. –

+0

+1 예, 아마도 이것이 더 좋은 해결책 일 것입니다. – maerics

0

많은 코드를 작성하지 않고도 인스턴스 변수를 만들 수있는 유연한 보석 [0]을 사용할 수 있습니다. 그냥

class SomeClass 
    include Flexible 
end 
sc = SomeClass.new 
sc.my_variable_name = 1 # or any other value 

[0] https://github.com/matthiasbeyer/flexible

관련 문제