访问ruby实例变量的最佳实践

时间:2016-04-30 01:01:30

标签: ruby

David Black的“扎实的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中添加一个实例方法。有更好的技术吗?

分配牌局的最佳方式是什么?

1 个答案:

答案 0 :(得分:3)

您现在可以访问它,因为您的脚本会调用attr_reader :cards

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

attr_reader是一个&#34;类宏&#34; (正如Paolo Perrotta在他的&#34; Metaprogramming Ruby&#34;书中所提到的这种模式)简单地定义了一个具有相同名称的ivar的吸气剂:

# this line...
attr_reader :cards

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

现在,如果您真的想要,可以穿透对象的面纱并使用instance_variable_get直接访问其实例变量:

my_deck.instance_variable_get(:@cards)

但是尽可能避免这种情况,以保持对象的良好封装。