2017-05-12 18 views
-1

私はこのコードを持っている:私のマップはなぜですか?奇妙なループ演技?

#test document for my pseudo code 

userInput = "go" 

arr = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 

while userInput != "exit" 

    arr.each do |first| 

    first.map! do |second| 

     if userInput.to_i == second 
     first[second] = "X" 
     end 

     print "|#{second}|" 

    end 

    print "\n" 

    end 

    puts "Type quit for exiting game, or a number" 
    userInput = gets.chomp 
end 

私は数でこれと種類を実行する場合、この問題が発生した:

Screenshot

を私はマップを変更した場合は!それをマップするには、次の反復で、マップは単に新しい配列を返すので、配列の保存された "X"は消えてしまいます。 mapを使って既存の値の値を変更したい!なぜそれが変わったのですか?

+0

"[ask]"と "[mcve]"とリンク先のページをお読みください。期待される成果は?イメージを削除し、テキストをコピーして質問に貼り付け、適切に書式設定します。イメージへのリンクがあなたの質問を壊す場合、/それほど意味をなさないでしょう。質問にもっと役に立つタイトルを記入してください。あなたが質問に入れた努力は、他人があなたを助けることを奨励します。覚えておいて、SOはディスカッションリストでも、ツイートしたくもありません。あなたは参考書を書くのを手伝っています。 –

+0

こんにちは、 私はあなたが提供したリンクを読みました。今から私はこの例を将来の質問に使用します。 Thxそれをもたらすために。 素敵な一日を! –

+0

この質問にもその情報を使用する必要があります。なぜなら、要件を満たす良い仕事をしていないからです。 –

答えて

0

map!ブロックからの戻り値と各要素を置換することによって配列を変換します。ブロックの戻り値は、ブロック内で評価された最後の式の戻り値です(通常は)。あなたの場合、ブロック内で評価される最後の式はnilを返す

print "|#{second}|" 

です。言い換えれば、配列内のすべての要素がnilに置き換えられます。これは、map!に実行するように指示されているためです。

+0

あまりにも速かったので、私の質問に。あまりにも遅くなって眠らなければならない:D ありがとう –

0

私はそれを解決しました。

問題は、マップループ内のprintステートメントです。これはnilを返し、最後の戻り値なので、配列内のすべてがnilに設定されます。

私はそうのようなprint文の下secondを置くことによってそれを解決:

first.map! do |second| 

     if userInput.to_i == second 
     second = "X" 
     end 

     print "|#{second}|" 
     second 

    end 
+0

もっと良い解決策は、 'map'型のブロックで' print'を使わないことです。 'map'-typeブロックは値を変更して別の値に変換するために使われます。あなたが 'map! 'を使っているときには、ブロックが最小限に抑え、そのことだけをしてください。私がブロックで出力するつもりなら、 'each'を使い、列挙可能なオブジェクトを変更する別の方法を考え出します。それは、私たちが物事を操作するときに私たちの心の中で物事を真っ直ぐ保つことに関するすべてです。また、あなたがしたことを示す回答を追加することは役に立ちません。それは非常に便利で他の答えがそれを解決しなかった場合を除いて、ちょうど重複しています。 –

関連する問題