2016-09-23 4 views
1

私は基本的なRubyを練習するためにゲームを作成しています。私のブラックジャックの試合では、私は引っ張っていくためのカードを作りました。Rubyのメソッドが元の配列を突然変異させないのはなぜですか?

player_cards = cards.shuffle!.shift(2) 

私がシフトを使用し、そのようにシャッフルと一緒にポップしてみました:私は配列をミックスするために管理している唯一の方法は、その配列から描くと次のように配列され、元のカードから2枚のカードを削除します:私はシャッフルなしでポップとシフトを使用している場合

IRBで
player_cards = cards.shuffle.shift 
player_cards = cards.shuffle.pop 

、私は(ハッシュの配列)からプルしようとしている配列はデッキからそれらのカードを削除します。シャッフルを追加すると、カードはデッキから永久に取り外されなくなります。私はシャッフルを使用する必要があります!私の仕事を完了するために。

私が知りたいことは、シャッフルで期待どおりにポップやシフトができないのはなぜですか? Rubyでの連鎖の初歩的な理解は、カード配列が最初にシャッフルされて返され、配列内の要素が削除されるということです。

私の唯一の誤りは、シャッフルが配列をシャッフルし、元のカード配列ではなくシャッフルされた配列を返すということです。シャッフルされた配列から1つまたは2つのカードをポップまたはシフトすると、元の配列の配列ではなく、シャッフルによって配列が返されます。あれは正しいですか?

+0

申し訳ありません問題を理解できません。あなたは私にそれを指摘できますか? – Aleksey

+0

@Aleksey問題は明らかに述べられていますが、私は何かをもっと明確にする理由は見当たりません。 – mudasobwa

+1

申し訳ありません私は今日は少し病気かもしれません。 – Aleksey

答えて

1

cards.shufflecards.shuffle!との間に有意差がある(きっバージョンが。)

前者新しいアレイを作成し、後者が元のを変異します。 、shuffleによって生成元の配列のコピーからあなた後者コードshift sおよびpop Sを前記

+0

それは私が問題かもしれないと思ったものですが、私は100%確実ではありませんでした。 Rubyのメソッドについての素晴らしいStackoverflowの質問と、私が上記のように一緒にチェーンされているときの仕組みはありますか?私が連鎖プロセスを詳細に理解していれば、将来の問題を解決するのに役立ちます。 –

+0

私はSOの質問についてはわかりませんが、チェーンメソッドは他の何かをチェーンするのと同じくらい単純です:メソッドは入力を受け取り、値を返します。チェーンされると、返されたものに対して次のメソッドが呼び出されます。簡単です'' a'.ord.to_s.split( '') 'を考えてみましょう。 '' 97.to_s'は '' 97 "'⇒ '' 97 'を返す.split(' ') '' "9"、 "7"] 'などを返します。混乱している、元のオブジェクトの変異です。親切なルールがあります:メソッドがレシーバを変更すると、その名前に「!」というエンディングがあります。それ以外の場合、メソッドは新しいインスタンスを生成する可能性があります。それが役に立てば幸い。 – mudasobwa

関連する問題