2016-04-30 237 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