2016-09-23 82 views
1

我正在创建一个游戏,以便练习一些基本的Ruby。在我的二十一点游戏中,我创建了一副扑克牌。我已经成功地混淆了阵列的唯一方法,从阵列汲取并从原来的牌阵是除去两张牌如下:为什么Ruby方法不会改变原始数组?

player_cards = cards.shuffle!.shift(2) 

我试图用移并与洗牌沿弹出,像这样:

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

在IRB,如果我用流行和换挡不洗牌,数组我试图从(阵列哈希)拉离甲板删除这些卡。只要我添加洗牌,卡片不再永久地从甲板上移开。我必须使用洗牌!为了完成我的任务。

我想知道的是,为什么不按预期随着随机播放和轮班工作?我对Ruby中链接的基本理解是,cards数组首先被洗牌并返回,然后数组中的元素被移除。

我只想到我的错误可能是洗牌洗牌数组并返回一个洗牌数组,但不是原始卡阵列。当我从该混洗阵列中弹出或移动一张或两张卡片时,它是通过洗牌而不是原始卡片阵列返回的数组。那是对的吗?

+0

对不起,我不明白这个问题。你能指点我吗? – Aleksey

+0

@Aleksey这个问题清楚地说明了,我没有看到任何理由来澄清更多。 – mudasobwa

+1

对不起,今天有点不舒服,也许是因为这个。 – Aleksey

回答

1

cards.shufflecards.shuffle!之间的显著差异(撞版本。)

前者创建新的数组,后者变异原一。从

这就是说,您的代码后者shift S和pop的拷贝原始数组,由shuffle产生的

+0

这就是我认为可能是问题,但我不是100%确定。有没有关于Ruby方法的很好的Stackoverflow问题,以及如何像上面一样进行链接时如何工作?如果我对链接过程有详细的了解,它将有助于解决未来的问题。 –

+0

我不确定SO问题,但链接方法与链接任何其他方法一样简单:方法接收输入并返回一个值。当链接时,下一个方法被调用返回的内容。简单。考虑''a'.ord.to_s.split('')'。 'a.ord'返回'97'⇒'97.to_s'返回'“97”'⇒'“97”.split('')'返回'[“9”,“7”]'等等。困惑,是原始对象的变异。一般来说,有一个善意的规则:如果一个方法突变了接收者,它的名字中会有一个尾巴'!'。否则,该方法可能会产生一个新的实例。希望能帮助到你。 – mudasobwa

相关问题