为什么赢了';Ruby方法是否会改变原始数组?

为什么赢了';Ruby方法是否会改变原始数组?,ruby,methods,shuffle,Ruby,Methods,Shuffle,我正在制作一个游戏来练习一些基本的Ruby。在我的21点游戏中,我创建了一副牌来抽牌。我唯一能够混合阵列、从该阵列中抽取并从原始卡阵列中移除两张卡的方法如下: player_cards = cards.shuffle!.shift(2) 我尝试使用shift和pop以及shuffle,如下所示: player_cards = cards.shuffle.shift player_cards = cards.shuffle.pop 在IRB中,如果我在没有洗牌的情况下使用pop和shift,我

我正在制作一个游戏来练习一些基本的Ruby。在我的21点游戏中,我创建了一副牌来抽牌。我唯一能够混合阵列、从该阵列中抽取并从原始卡阵列中移除两张卡的方法如下:

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洗牌数组并返回一个洗牌数组,而不是原始的卡片数组。当我从洗牌数组中弹出或移动一两张牌时,它是洗牌返回的数组,而不是原来的牌数组。对吗

和(撞击版本)之间存在显著差异

前者创建一个新数组,后者对原始数组进行变异


也就是说,您的后一个代码
shift
s和
pop
s来自原始数组的副本,由
shuffle

生成。很抱歉,我无法理解这个问题。你能给我指一下吗?@Aleksey问题已经说得很清楚了,我看不出有任何理由再澄清什么了。对不起,我今天有点不舒服,也许是因为这个原因。这就是我认为可能存在的问题,但我不是100%确定。关于Ruby方法,还有一个很好的Stackoverflow问题吗?当像我上面所做的那样链接在一起时,它们是如何工作的?如果我对链接过程有详细的了解,这将有助于解决未来的问题。我不确定这个问题,但链接方法与链接其他任何东西一样简单:该方法接收输入并返回值。链接时,将对返回的内容调用下一个方法。这很简单。考虑<代码> 'A.Or.toys.拆分('')< /代码>code>a.ord返回
97
⇒ <代码>97。to_s返回
“97”
⇒ <代码>“97”。拆分(“”)返回
[“9”,“7”]
等。您混淆的是原始对象的变异。一般来说,有一个善意的规则:如果一个方法改变了接收者,那么它就有一个结束符
在名称中。否则,该方法可能会生成一个新实例。希望能有帮助。