0

次のコードを実行すると:

range = [2,3,4,5,6,7,8,9,10]
range.each {|z| print z, " "}
puts "\n"
range.map! {|y| y /= 3 if y % 3 == 0}
range.each {|z| print z, " "}

次の出力が得られます。

2 3 4 5 6 7 8 9 10
nil 1 nil nil 2 nil nil 3 nil

出力の 2 行目に次の内容が含まれていることを期待していますが、

2 1 4 5 2 7 8 3 10

私は何を間違っていますか?mapオペレーターの方法と、それに関連付けられたコード ブロックがどのように機能するかを誤解していますか?

注: 私は何年にもわたって C/C++ で大規模なプログラミングを行った後、Ruby を学んでいます。これは、私が行き詰っていた動作しない Ruby プログラムの最小のスニペットです。必要に応じて、元のプログラムを貼り付けることができます。その中から、この MWE も構築しました。

4

2 に答える 2

7

y /= 3 if y % 3 == 0それ自体が全体の表現です。条件部分が false と評価されると、式全体が と評価されnilます。map!配列をその場で変更しており、結果の要素が数値またはnil.

目的の出力を得るためにそれを書き直す 1 つの方法は次のとおりです。

range.map! {|y| y % 3 == 0 ? y / 3 : y}
于 2013-05-19T20:31:30.817 に答える
3

これに置き換えます:

range.map! {|y| y % 3 == 0 ? y / 3 : y}

mapブロックから返された値を使用します。一時y変数を変更しても意味がありません。

于 2013-05-19T20:31:35.693 に答える