2016-04-30 243 views
0

大衛·布萊克的「基礎紮實Rubyist」提供了一個例子來說明使用cycle方法:最佳實踐

class PlayingCard 
    SUITS = %w{ clubs diamonds hearts spades } 
    RANKS = %w{ 2 3 4 5 6 7 8 9 10 J Q K A } 
    class Deck 
     attr_reader :cards 
     def initialize(n=1) 
      @cards = [] 
      SUITS.cycle(n) do |s| 
       RANKS.cycle(1) do |r| 
        @cards << "#{r} of #{s}" 
       end 
      end 
     end 
    end 
end 

deck = PlayingCard::Deck.new 

我想訪問變量@cards的實例子中定義類。訪問這個數組的最佳方法是什麼?

我的理解是,我將不得不在Deck中添加實例方法。有更好的技術嗎?

指定手牌的最佳方式是什麼?

+0

從哪裏訪問? – sawa

+0

什麼是最好使用@卡數組來定義卡的隨機手?這應該來自課堂甲板(或遊戲卡)內部,還是最好在室外完成,然後參考課程?感謝您的幫助。 – Cameron

回答

3

您可以現在已經訪問它,因爲你的腳本調用attr_reader :cards

my_deck = PlayingCard::Deck.new(10) 
my_deck.cards 

attr_reader是一個「類宏」(如保羅·佩羅塔提到在他的「元編程紅寶石」書這種模式),其簡單地定義吸氣到伊娃具有相同名稱:

# this line... 
attr_reader :cards 

# ... is equivalent to 
def cards 
    @cards 
end 

現在,如果你真的願意,你可以穿透物體的面紗,直接訪問它的實例變量與instance_variable_get

my_deck.instance_variable_get(:@cards) 

但儘量避免這種情況,以保持對象的良好封裝。

+1

小問題:Ruby沒有宏。 [Module#attr_reader](http://ruby-doc.org/core-2.1.1/Module.html#method-i-attr_reader)是類方法,因此最好引用它。 –

+0

謝謝。然後可以單獨使用@cards數組來定義卡的手,對嗎? – Cameron

+1

除了Cary的觀點,attr_reader沒有被定義(在OP的腳本中),但屬性讀取器是使用'attr_reader'方法定義的。 – sawa