class CAR
FORD = 1
GM = 2
BMW = 3
end
我想创建一个像:
这样的数组all_cars = [CAR::FORD, CAR::GM, CAR::BMW]
=>[1, 2, 3]
有没有办法可以为每个元素输入CAR ::来初始化这个数组,比如
all_cars = %(FORD GM BMW).map {|ele| "CAR::" + ele}
=>["CAR::FORD", "CAR::GM", "CAR::BMW"]
不想要我想要
答案 0 :(得分:8)
有点像Phrogz的答案,你可以像这样定义常量并初始化数组:
class Car
MAKES = [
FORD = 1,
GM = 2,
BMW = 3
].freeze
end
这样,您不仅可以访问各个命名空间常量,而且还可以将它们全部作为常量,不需要重复:
Car::MAKES # => [1, 2, 3]
Car::FORD # => 1
不要忘记freeze
或者人们可能会弄乱您的阵列。如果您需要在特定操作中修改它,则可以始终dup
。
答案 1 :(得分:5)
我不是在类外创建常量数组,而是在类本身内创建这样的集合。在这种情况下,您没有问题:
class Car
FORD = 1
GM = 2
BMW = 3
MAKES = [ FORD, GM, BMW ]
end
p Car::MAKES
#=> [1, 2, 3]
但如果你仍然按照你的建议行事,你需要Module#const_get
:
all = %w[ FORD GM BMW ].map{ |k| Car.const_get(k) }
#=> [1, 2, 3]
答案 2 :(得分:3)
%w(FORD GM BMW).map{|x| CAR.class_eval(x)} # => [1, 2, 3]
或
%w(FORD GM BMW).map{|x| eval("CAR::#{x}")} # => [1, 2, 3]
答案 3 :(得分:0)
这将使用模块而不是类来完成:
module CAR
FORD = 1
GM = 2
BMW = 3
end
include CAR
CAR::FORD # => 1
CAR::GM # => 2
CAR::BMW # => 3
all_cars = [CAR::FORD, CAR::GM, CAR::BMW]
all_cars # => [1, 2, 3]