Я хочу создать хэш, ключи которого относятся к символу класса и значение некоторого массива, который имеет, например, цвета, относящиеся к этому конкретному классу. На данный момент моя реализация такова:Как я могу ссылаться на класс с символом в 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")
Что вы подразумеваете под «ссылкой на класс с символом»? Вы можете использовать что-либо как хэш-ключ, включая класс. –
Разумным, на самом деле не имеет смысла, что 'AnimalColours' будет содержать код, для которого животное может быть тем цветом. Этот код должен идти в соответствующем классе животных. «AnimalColours» должен содержать только код, общий для цветов _all_. – Max
Зачем конвертировать в символы? Строки будут работать одинаково хорошо в этом случае, а не то, что это будет иметь огромное влияние, но символы будут потреблять больше памяти, поскольку они заморожены и никогда не будут подхвачены GC. Хотя, поскольку они находятся в class_variable, это не имеет большого значения, так как это не будет GC'd. Хороший новый, хотя для тех, кто ухаживает, seem 2.2.0 может на самом деле [Символы GC, созданные за пределами C-уровня] (https://bugs.ruby-lang.org/issues/9634) – engineersmnky