質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

430閲覧

RubyのArray.newの挙動について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2017/07/15 07:45

編集2017/07/15 08:50

###前提・実現したいこと
Array.newと[]を使って配列を作る方法で、メソッドの結果が異なるのか知りたい。
###発生している問題・エラーメッセージ

私の勘違いの可能性が高い。

Array.newで作った二次元配列と[]で作った
二次元配列で若干結果が異なる場合がある?

これは仕様なのでしょうか?

###該当のソースコード

Ruby

1# encoding: utf-8 2 3array1 = Array.new(3, []) 4p array1 # => [[], [], []] 5 6# array1[0] = [1] # => [[1], [], []] 7# array1[0].concat([1]) # => [[1], [1], [1]] 8# array1[0] << 1 # => [[1], [1], [1]] 9array1[0].unshift(1) # => [[1], [1], [1]] 10 11p array1 12 13array2 = [[], [], []] 14p array2 # => [[], [], []] 15 16# array2[0] = [1] # => [[1], [], []] 17# array2[0].concat([1]) # => [[1], [], []] 18# array2[0] << 1 # => [[1], [], []] 19array2[0].unshift(1) # => [[1], [], []] 20 21p array2 22

###試したこと
調査中。

###補足情報(言語/FW/ツール等のバージョンなど)
ruby 2.2.6p396 (2016-11-15 revision 56800) [i386-mingw32]
Windows10

#追記
この件について書かれたページ

Ruby 配列の初期化と多重配列

Array.newで多重配列を作るときはブロックを使わないと
おかしくなるということでした。

簡単な二次元配列の作り方

こちらのページのコメント欄でArray.new(3){[]}以外の方法が紹介されていました。

それを利用して書くと

Ruby

1array = 3.times.map{[]}

という感じになります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

はい、Array.new(個数, オブジェクト)として配列を作ると、同じオブジェクトが使われます(るりま)。

要素毎に val が複製されるわけではないことに注意してください。 全要素が同じオブジェクト val を参照します。

1つ1つ別な配列で初期化したい場合は、後者のように配列リテラルを連ねて書く以外にも、Array.new(3) { [] }とブロックで渡す方法があります。

投稿2017/07/15 07:49

編集2017/07/15 07:49
maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/07/15 07:51

回答ありがとうございます。 私も、今、この件について書かれたページを発見しました。
maisumakun

2017/07/15 07:52

結構やらかしがちなミスの1つです。
退会済みユーザー

退会済みユーザー

2017/07/15 07:54 編集

何回やっても見た目が同じなのに結果が異なるので混乱しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問