2015-09-17 34 views
0

我剛剛退出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

許多優秀的問題都會根據專家的經驗產生一定程度的意見,但對這個問題的回答往往基於意見而不是事實,參考或具體專業知識。 – dax

+0

是的,我以爲...但我只想知道是否有一個會議我應該使用 –

+0

*「LIST常量」* - 複數?只有一個常量:'LIST'。顏色鍵是符號。 – Stefan

回答

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,取決於誰在引入這些常量給用戶(程序員)

+0

哇,真的,這很好,顯然現在Colors :: Colors類已經不再需要了,謝謝,我明白你的方法 –

+0

請注意'sample(n)'返回* n *個獨特元素,這不等於OP的代碼。 – Stefan

+0

@斯特凡同意。在OP的代碼中有'sample'的評論,所以我不確定OP想要什麼 –