【发布时间】:2014-12-26 18:07:40
【问题描述】:
我想创建一个哈希,其键引用一个类的符号,值一些数组,例如,引用该特定类的颜色。截至目前,我的实现是这样的:
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应该只包含对所有颜色通用的代码。 -
为什么要转换成符号?在这种情况下,字符串同样可以正常工作,并不是说它会产生巨大的影响,但是符号会因为它们被冻结而消耗更多的内存,并且永远不会被 GC 拾取。虽然因为它们在 class_variable 中,但它并不重要,因为它也不会被 GC 处理。不过对于那些关心seesm 2.2.0 的人来说,这可能是个好消息GC Symbols created outside the C-level
-
@Max,我想拥有一个包含所有动物颜色的容器,所以动物类可以从该类中选择自己的,因为事实上,动物的颜色是额外的, 并没有真正与类的特性挂钩
-
为什么要不断地在类和符号之间来回转换?为什么不直接使用类作为键?