mapは「配列変更」で破壊的「!」をつけるかどうかで保存か、捨てるかを選択できる。
参考サイト
Google検索「ruby map array」
https://ref.xaio.jp/ruby/classes/array/map
https://qiita.com/4geru/items/a773f9362fb90e0e0b4f
map
「mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。」
↓自分変換(ご了承ください笑。)
「mapメソッドは、要素の数だけ要素順に繰り返し、do~endブロック内で処理をした戻り値(出力値)を要素として配列を作成し、空中に保持します。その場しのぎというか、使い捨てというか、保存しなければ一瞬で消えます。」
mapを含んだ式自体(「配列名からendまで」)それが空中保持の架空配列?を表します。架空配列なので元の配列自体は変わりません。
「いまこの瞬間欲しい使い捨て配列を作る」イメージ?すいません。
あとコンソールの出力表示が「{}」と「do~end」では異なる。意味は同じ(だと思う)。
array = ["a", "b", "c", "d", "e", "f", ] #パターンdoend p array.map do |ele| #mapの出力値はpで表示したら即消えます ele.upcase #大文字化 end #パターン{} p array.map { |ele| ele.upcase } p array #=>元配列表示
map!
「map!メソッドは、要素の数だけ要素順に繰り返しブロックを実行し、各要素をブロックの戻り値と入れ替えます。」
↓自分変換(ご了承ください笑。)
「map!メソッドは、要素の数だけ繰り返し、do~endブロック内で処理をした戻り値(出力値)は元の配列の各要素を上書きし、元の配列の中身を作り変えてしまいます。」
mapのおおかたのイメージは上記の「mapの説明」でわかったかと思います(?)。mapは空中に架空配列?を作り、保存しなければすぐ消えてしまいますが、map!メソッドは実行してしまうだけで、元の配列の中身を作り変えて、上書きして、保存してしまいます。
※「架空配列」とか「すぐ消える」とか他にも勝手な言葉を使っていますが、mapを使った式それ自体が配列を表していると言えます。
=begin 要所要所コメントを外してください 見やすいので{}だけ書きます。 1と2はちょっとした違いです。 =end array = ["a", "b", "c", "d", "e", "f", ] p array #1 #p array.map! {|ele| ele.upcase} #2 #array.map! {|ele| ele.upcase} #p array
元のarrayは戻ってきません…。
「map」で元の配列を変える
ちなみにmap!使わなくても「map」で元の配列を変えることができます。単にただの上書きです。
(あれ?「map!」って自動上書きってことか?)
array = [1, 2, 3,] array = array.map{ |ele| ele.to_s } #同名の配列に入れ直している p array #=>元arrayが変わってしまいました
【復習】
#mapメソッド array = [1, 2, 3,] p array.map {|ele| ele.to_s} #=>空中配列表示 p array #=>元配列表示 #map!メソッド array.map! { |ele| ele.to_s} #=>配列変更 p array #=>新配列
mapは「配列変更」で破壊的「!」をつけるかどうかで保存、捨てるかを選択できる。