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
中添加一个实例方法。有更好的技术吗?
分配牌局的最佳方式是什么?
答案 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)
但是尽可能避免这种情况,以保持对象的良好封装。