2016-09-23 78 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

相關問題