2017-02-13 9 views
0

私は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からの操作/情報収集がどこで行われるべきかに関して私は嫌いですか?ありがとう!

+0

'@のcards'は(の値を読んで)あなたが成功しshow''で行われているこのインスタンス変数、インスタンス変数とは何か 'attr_reader'が行うことは、あなたがアクセスすることを許可されます方法。 –

+0

あなたはまだ混乱していますか? Andreyさんのコメントを理解しましたか? –

+0

私はありがたくあります。最初は、PlayingCardクラスの外で利用できると思っていました。 –

答えて

0

Rubyでは、変数のスコープを変更してそのクラスの外に見ることはできません。あなたは

def show 
    @cards 
end 

で行ったように変数を公開する適切な方法は、方法でそれをラップすることですattr_reader方法が自動的にあなたのための方法を作成する便利なメソッドです。だから、attr_reader :cardsを追加すると、暗黙のうちに自分のクラスにこのメソッドを追加します。あなたは今two_decks.cardsを使用して@cardsにアクセスすることができますし、まったくshow方法を必要としないことを意味

def cards 
    @cards 
end 

を。

それはあなたも、このメソッドを追加するためにattr_writer :cardsを使用できることを言及する価値があるかもしれません:two_cards.cards = some_value

そして、あなたは自動的に読み取りの両方を追加するためにattr_accessor :cardsを使用することができますので、同じように呼び出すことができ

def cards= value 
    @cards = value 
end 

および書き込みメソッド。

0

これは私が進めていたものです。私は、私の混乱がattr_ *プロパティがメソッドのように呼び出すことができることを認識していないと思う。助けてくれてありがとう!

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) 
 
p two_decks.cards.count

関連する問題