2016-08-12 5 views
1

@hand配列からカードを削除したい場合は、指定した入力と同じランクにします。私は配列全体をループしています、なぜそれが最後のカードを取り除かないのですか?どんな助けでも大歓迎です!ループ内で最後の要素が削除されない

出力:

2 of Clubs 
2 of Spades 
2 of Hearts 
2 of Diamonds 
3 of Clubs 
3 of Spades 
------------ 
2 of Clubs 
2 of Spades 
2 of Hearts 
2 of Diamonds 
3 of Spades 

コード:

deck = Deck.new 
hand = Hand.new(deck.deal, deck.deal, deck.deal, deck.deal, deck.deal, deck.deal) 
puts hand.to_s 
hand.remove_cards("3") 
puts "------------" 
puts hand.to_s 

ハンドクラス:

class Hand 

    def initialize(*cards) 
     @hand = cards 
    end 

    def remove_cards(value) 

     @hand.each_with_index do |hand_card, i| 

      if hand_card.rank == value 
       @hand.delete_at(i) 
      end 

     end 
    end 

    def to_s 
     output = "" 

     @hand.each do |card| 
      output += card.to_s + "\n" 
     end 

     return output 
    end 
end 

カードのクラス:

class Card 

    attr_reader :rank, :suit 

    def initialize(rank, suit) 
     @rank = rank 
     @suit = suit 
    end 

    def to_s 
     "#{@rank} of #{@suit}" 
    end 
end 
+0

Deck'が示されていないクラス 'とクラス' Card'はあなたが示したコードでは使用されません。 –

答えて

1

remove_cards(value)には問題があり、あなたはインスタンス変数@handを持っている。このライン

@hands.each_with_index do |hand_card, i| 

である:一つはすべきではないdelete反復中。正しい方法は、手からArray#reject!カードに次のようになります。

def remove_cards(value) 
    @hands.reject! { |hand_card| hand_card.rank == value } 
end 
+0

反復処理中に削除を使用するか、まっすぐに間違っているのは悪い習慣ですか?なぜそう?私のコードは期待どおり実行されているので、ありがとう! –

+0

これはまっすぐに間違っています。要素が削除された後に配列が「圧縮される」と、内部イテレータポインタが混乱します。 – mudasobwa

+0

説明していただきありがとうございます! –

0

あなたの問題はない@hands

+0

私は自分の質問を投稿した直後に私の誤植に気付きました(私のテキストエディタには色付けがなく、タイプミスの変数を見やすくなりました)。私は質問を編集しても問題は残っています。 –

+0

ところで、私たちの時間を無駄にするのではなく、通常のエディタを使用する余裕があります。 – mudasobwa

+0

@mudasobwa残念ながら私は現在、ロックされたコンピュータで動作しており、IDEをインストールする権限はありません。 –

関連する問題