私はThe Grounded Rubyistを勉強していますが、サブクラスDeckのインスタンスvar @cardsに格納されている配列にアクセスする方法を理解できません。attr_readerのインスタンス変数のアクセシビリティについて理解しています。
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
two_decks = PlayingCard::Deck.new(2)
puts two_decks
# => #<PlayingCard::Deck:0x007fb5c2961e80>
これは理にかなって、PlayingCard :: Deckからtwo_decksのオブジェクトIDを返します。これをもっと便利にするために、@cardsに格納されている配列にアクセスするための唯一の方法は、別のメソッドDeck#showを追加することでした。今、私がやったように、@cardsの他のメソッドを呼び出すことができます。簡単な例では@cardsのカウントを取得することができます:
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
def show
@cards
end
end
end
two_decks = PlayingCard::Deck.new(2).show
p two_decks.count
# => 104
私はattr_readerが@cardsインスタンスvarがクラス外で見ることができるようにされたと思って、私は混乱しています。 Cards#showメソッドは変数のスコープを増やしますか?私が行方不明になっているより良い方法はありますか? @cardsからの操作/情報収集がどこで行われるべきかに関して私は嫌いですか?ありがとう!
'@のcards'は(の値を読んで)あなたが成功しshow''で行われているこのインスタンス変数、インスタンス変数とは何か 'attr_reader'が行うことは、あなたがアクセスすることを許可されます方法。 –
あなたはまだ混乱していますか? Andreyさんのコメントを理解しましたか? –
私はありがたくあります。最初は、PlayingCardクラスの外で利用できると思っていました。 –