使用常量创建数组而不重复指定拥有类

时间:2011-02-11 01:30:19

标签: ruby

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"]

不想要我想要

4 个答案:

答案 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)

  1. 我不是在类外创建常量数组,而是在类本身内创建这样的集合。在这种情况下,您没有问题:

    class Car
      FORD = 1
      GM   = 2
      BMW  = 3
      MAKES = [ FORD, GM, BMW ]
    end
    
    p Car::MAKES
    #=> [1, 2, 3]
    
  2. 但如果你仍然按照你的建议行事,你需要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]