2014-10-30 1 views
0

키의 클래스 기호를 참조하는 해시를 만들고 싶습니다. 예를 들어, 특정 클래스를 참조하는 색상이있는 값 배열. 지금까지 구현 한 내용은 다음과 같습니다.Ruby에서 심볼이있는 클래스를 어떻게 참조합니까?

module DomesticAnimal 
    attr_accessor :name 

    def eat(food) 
     puts "Eating #{food}" 
    end 
end 

module AnimalColours #Lo separo para realizar más abstracción 
    @@colours = { 
     :dog => ["White", "Grey", "Black", "Brown"], 
     :cat => ["White", "Black"], 
    } 

    def self.hasColour(type, colour) 
     if @@colours[type] != nil 
      @@colours[type].each do |x| 
       return true unless x != colour 
      end 
     end 
     return false 
    end 
end 

class Dog 
    include DomesticAnimal 

    def initialize(name, colour) 
     @name = name 

     if AnimalColours.hasColour(:dog, colour) 
      @colour = colour 
     else 
      raise "Colour error" 
     end 
    end 

    def goOut(place) 
     puts "#{name} when out for a walk to #{place}" 
    end 
end 

dog = Dog.new("Juan", "Black") 

dog.goOut("the park") 
+1

"기호가있는 수업 참조"는 무엇을 의미합니까? 클래스를 포함하여 무엇이든 해시 키로 사용할 수 있습니다. –

+1

디자인 적으로 'AnimalColours'에는 동물이 어떤 색을 사용할 수 있는지에 대한 코드가 포함될 것입니다. 그 코드는 각각의 동물 클래스에 있어야합니다. 'AnimalColours'는 _all_ colors에 포괄적 인 코드만을 포함해야합니다. – Max

+1

왜 기호로 변환합니까? 문자열은이 경우에도 똑같이 잘 작동하지만 큰 영향을 미치지는 않지만 기호가 동결되어 GC에 의해 선택되지 않으므로 더 많은 메모리를 소비합니다. 그들은 class_variable에 있기 때문에 그것은 GC'd되지 않을 것이기 때문에별로 중요하지 않습니다. 예를 들어 2.2.0을 신경 쓰는 사람들을위한 새로운 기능은 실제로 [C- 레벨 외부에서 생성 된 GC 심볼] (https://bugs.ruby-lang.org/issues/9634) – engineersmnky

답변

0

기호 대신 해시 키를 문자열로 사용할 수 있습니다. 클래스 (문자열)의 이름은 class.name으로 액세스 할 수 있습니다.

기호로 지정하려면 class.name.to_sym을 호출하고 키는 예를 들어 :Dog이 될 수 있습니다. 선행 콜론 다음의 기호는 클래스 이름과 동일합니다.

+0

클래스를 먼저 해시 키로 사용할 수있다. – Max

+0

내가 말했듯이, 반복에 관한 문자열보다 빠르기 때문에 기호를 사용하고 싶었습니다. 예를 들어 – gibarsin

+0

@ user3452637 마이크로 최적화는 루비에 관한 것이 아닙니다. 그럼에도 불구하고 기호가 문자열보다 나쁜 경우도 있습니다. 더 빨라진 것보다 다른 것을 선호하는 더 좋은 이유가 필요합니다. – Max