为什么 Ruby 方法不会改变原始数组?

Why won't Ruby methods mutate the original array?

我正在创建一个游戏来练习一些基本的 Ruby。在我的二十一点游戏中,我创建了一副牌来抽牌。我设法混合数组、从该数组中提取并从原始卡片数组中删除两张卡片的唯一方法如下:

player_cards = cards.shuffle!.shift(2)

我试过像这样将 shift 和 pop 与 shuffle 一起使用:

player_cards = cards.shuffle.shift
player_cards = cards.shuffle.pop

在 IRB 中,如果我在不洗牌的情况下使用 pop 和 shift,我试图从中提取的数组(哈希数组)会将这些牌从牌组中移除。一旦我添加洗牌,卡片就不再永久地从牌组中移除。我必须使用随机播放!为了完成我的任务。

我想知道的是,为什么 pop 和 shift 不能像预期的那样使用 shuffle?我对 Ruby 中链接的初步理解是,首先将卡片数组洗牌并返回,然后删除数组中的一个元素。

关于我的错误可能是什么,我唯一的想法是 shuffle 洗牌数组和 returns 洗牌数组,而不是原始卡片数组。当我从该洗牌数组中弹出或移动一张或两张牌时,它是洗牌返回的数组,而不是原始牌数组。那是对的吗?

cards.shuffle and cards.shuffle!(撞版)有明显区别

前者创建一个新数组,后者改变原来的

就是说,您后面的代码 shifts 和 pops 来自 copy 的原始数组,由 shuffle 生成。