创建常量的首选方法

时间:2015-09-17 12:18:55

标签: ruby

我不再使用Ruby,而是通过制作MasterMind游戏来练习。我有一个名为Color的课程,如下所示。

module Colors
  LIST =
  {
      R: "Red",
      B: "Blue",
      G: "Green",
      Y: "Yellow",
      V: "Violet",
      P: "Purple",
      I: "Indigo",
      A: "Ash",
      O: "Orange"
    }
class Colors
  def initialize

  end


  def self.generate_colors(amount)
    # LIST.to_a.sample(amount)
    sample = []
    list = LIST.to_a
    amount.times{ sample << list[Random.rand(list.length-1)] }
    sample
  end

  def self.get_color(key)
    LIST[key]
  end

  def self.get_color_keys (colors)
    keys_array = []
    colors.each{|key, color| keys_array << key.to_s;}
    return keys_array
  end

  def self.get_color_values(colors)
    values_array = []
    colors.each{|key, color| values_array << color}
    values_array
  end
end
end

我的导师说,LIST常量可以很容易地放在Colors类中,这样我只需调用一个方法,比如get_colors,就可以返回颜色列表。

由于我是Ruby新手,我想知道正常的Ruby约定是什么,你认为哪种方法更好。

1 个答案:

答案 0 :(得分:1)

由于您的课程主要使用class方法,因此它似乎就像一个模块。您的代码可以简化为以下。除非class具有某种状态(某些实例变量),否则不需要实例化它。

module Colors
    COLORS = {
      R: "Red",
      B: "Blue",
      G: "Green",
      Y: "Yellow",
      V: "Violet",
      P: "Purple",
      I: "Indigo",
      A: "Ash",
      O: "Orange"
    }

    def self.pick_colors(count)
        sampled_keys = []
        count.times { sampled_keys << COLORS.keys.sample }
        sampled_keys
    end
end

p c = Colors.pick_colors(2)
#=> [:R, :A]

p Colors::COLORS[c[0]]
#=> ["Red"]

p Colors::COLORS
#=> {:R=>"Red", :B=>"Blue", :G=>"Green", :Y=>"Yellow", :V=>"Violet", :P=>"Purple", :I=>"Ind

就常量的定义而言,它们最好在它们最合乎逻辑的属性中定义 - 它可以是ModuleClass,具体取决于谁将这些常量引入到用户(程序员)