【问题标题】:Last element not being removed in loop最后一个元素没有在循环中被删除
【发布时间】:2016-12-19 16:43:48
【问题描述】:

如果卡片与给定输入具有相同的等级,我想从 @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

【问题讨论】:

  • Deck 类未显示,您显示的代码未使用 Card 类。

标签: arrays ruby methods


【解决方案1】:

remove_cards(value) 有一个问题:在迭代期间不应delete。正确的方法是从一手牌到Array#reject! 牌:

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

【讨论】:

  • 在迭代期间使用 delete 是不好的做法还是直接出错?为什么会这样?我的代码现在按预期运行,非常感谢!
  • 完全错了。当数组在元素删除后被“挤压”时,内部迭代器指针会变得混乱。
【解决方案2】:

你的问题在这一行

    @hands.each_with_index do |hand_card, i|

你有一个实例变量@hand,而不是@hands

【讨论】:

  • 我在发布我的问题后立即注意到我的拼写错误(我的文本编辑器没有着色,它可以更容易地查看未键入的变量)。我编辑了问题,但仍有问题。
  • 顺便说一句,您应该负担得起使用普通编辑器,而不是浪费我们的时间在您的拼写错误上。
  • @mudasobwa 不幸的是,我目前正在使用锁定的计算机工作,并且没有安装任何 IDE 的权限。
  • 发现 c9.ioideone.com 或者只是在谷歌上搜索“在线 ide”——周围有很多。
  • 再次感谢,我对编码世界还比较陌生,因此对我的无知表示歉意。
猜你喜欢
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2016-11-20
  • 2017-12-05
  • 1970-01-01
相关资源
最近更新 更多