🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Q&A

解決済

3回答

1384閲覧

100個の配列をループで作る方法(array1からarray100)

thesnowman

総合スコア154

Ruby

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

0グッド

0クリップ

投稿2019/10/07 23:09

編集2019/10/07 23:17

array1からarray100までの100個の配列をループで作りたいです。

以下でうまくいくと思ったらエラーですね。
(式展開は代入される側としては使えないという事ですかね?)

ruby

1100.times do |i| 2 "array#{i}" = Array.new 3end

みなさまならどうやって作りますか?
ご教授いただけましたら幸いでございます。

一応載せますと、上記はこんなエラーです。
Main.rb:2: syntax error, unexpected '=', expecting end
"array#{i}" = Array.new
^
Main.rb:3: syntax error, unexpected end, expecting end-of-input

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

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

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

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

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

guest

回答3

0

array1からarray100までの100個の配列をループで作りたいです。

そういう発想は間違っています。
(配列の)配列にしましょう。

投稿2019/10/07 23:17

otn

総合スコア85893

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

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

thesnowman

2019/10/07 23:21

なるほど、前提となる発想自体が間違ってたんですね。
guest

0

ベストアンサー

Ruby

11.upto(100) do |i| 2 define_method("array#{i}") do 3 res = self.instance_variable_get("@array#{i}") 4 if res.nil? 5 self.instance_variable_set("@array#{i}", []) 6 end 7 self.instance_variable_get("@array#{i}") 8 end 9 define_method("array#{i}=") do |value| 10 self.instance_variable_set("@array#{i}", value) 11 end 12end 13 14p array21 15p array61 16(1..3).each { |e| array21 << e } 17(4..6).each { |e| array61 << e } 18p array21.zip(array61).to_h 19

投稿2019/10/09 11:33

編集2019/10/10 22:24
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

thesnowman

2019/10/11 07:43

ご丁寧にありがとうございます!
guest

0

eval 関数を使えば質問者様が行いたいことはできなくもないです。(ただし以下ではグローバル変数にしています。)

ruby

1100.times do |i| 2 eval("$array#{i+1} = Array.new") 3end 4 5100.times do |i| 6 eval("p $array#{i+1}") 7end

otn様がおっしゃられている通り普通は2次元配列にするものだと思います。その場合はこうです。

ruby

1arrays = Array.new(100) do Array.new end

ちなみに以下だと思った通りの結果を望めません。なぜなら、「同じ配列オブジェクト」を100個分 arrays に入れていることになるので、一つを変更すると残り99個も全て変更される(ように見える)からです。

ruby

1arrays = Array.new(100, Array.new)

投稿2019/10/07 23:33

編集2019/10/07 23:35
namnium1125

総合スコア2045

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

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

winterboum

2019/10/08 02:02

eval("$array#{i+1} = Array.new") の方法は、 グローバル変数、インスタンス変数ではできますが、$も@もない変数ですと未定義のままとなります。
maisumakun

2019/10/08 02:07 編集

(間違えたコメントでしたので消します)
namnium1125

2019/10/08 02:06

コメントありがとうございます。それはそうですね…としか。あまりRubyに明るくないので、もし他に方法があるなら回答していただければと思います。
namnium1125

2019/10/08 02:09 編集

> maisumakun様 コメントありがとうございます
winterboum

2019/10/08 02:09

@も$も無い変数ですと、ダイナミックにつくる方法は多分ないです。
asm

2019/10/08 03:09

作る方法はあるけど、いろいろな関係でまともに読み出す方法がないんです。 bind = binding bind.local_variable_set(:a, "test") p bind.eval("a")
namnium1125

2019/10/08 03:17

コメントありがとうございます。結局のところ、array1〜array100を作ろうという考え自体が普通しないものですから、多少実装が困難というのは納得です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問