2014-10-30 4 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_. – Max

+1

Зачем конвертировать в символы? Строки будут работать одинаково хорошо в этом случае, а не то, что это будет иметь огромное влияние, но символы будут потреблять больше памяти, поскольку они заморожены и никогда не будут подхвачены GC. Хотя, поскольку они находятся в class_variable, это не имеет большого значения, так как это не будет GC'd. Хороший новый, хотя для тех, кто ухаживает, seem 2.2.0 может на самом деле [Символы GC, созданные за пределами C-уровня] (https://bugs.ruby-lang.org/issues/9634) – engineersmnky

ответ

0

Вы можете использовать строки как ключи к хэшу вместо символов. Вы можете получить доступ к имени класса (строки) с помощью class.name.

Я полагаю, что если бы вы хотели, чтобы они были символами, вы могли бы позвонить class.name.to_sym и иметь ключи, например, :Dog. Обратите внимание, что символ после главного двоеточия идентичен имени класса.

+0

Они могут использовать сами классы как хэш-ключи (если они сначала объявляют классы). – Max

+0

Я хотел использовать символы, потому что, как мне сказали, они быстрее, чем строки для итераций, например – gibarsin

+0

@ user3452637. Такая микро-оптимизация - это не то, что Ruby. Несмотря на это, есть случаи, когда символы хуже строк. Вам нужна лучшая причина, чтобы предпочесть их, кроме того, что это может быть быстрее. – Max

Смежные вопросы