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

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

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

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

Q&A

解決済

3回答

3367閲覧

変数名を文字列の入った配列からまとめて定義したい

harupi

総合スコア16

Ruby

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

0グッド

1クリップ

投稿2019/05/08 11:54

変数を宣言し値を代入するという操作を、配列を用いてまとめて行いたいです。

ruby

1one = 1 2two = 2 3three = 3

上記のような新しい変数に値を代入する作業を、以下のような「変数名にしたい文字列が入った配列」を用いてまとめて行うことは出来ないでしょうか。

Ruby

1['one', 'two', 'three']

Rubyのコードを文字列で出力するような別のスクリプトを書けば出来そうだということは分かるのですが、一つのスクリプトで完結させる方法があればそちらの方が便利だと思うので是非教えて頂きたいです。

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

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

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

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

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

guest

回答3

0

動的に新しいローカル変数を定義する事はできません。

動的に変数を作りたいときは代替としてHashを用いるとおおよその場合、うまくいきます。

ruby

1values = ['one', 'two', 'three'].each.with_index(1).map{|key, val| [key, val] }.to_h 2 3p values # => {"one"=>1, "two"=>2, "three"=>3} 4p values["one"] # => 1

新しいローカル変数ではなく、事前に変数名が決まっているローカル変数の場合は
binding.local_variable_setが使えます。

ruby

1one = nil 2two = nil 3three= nil 4 5binding.local_variable_set(:one, 1) 6binding.local_variable_set(:two, 2) 7binding.local_variable_set(:three, 3) 8 9p [one,two,three] #=> [1, 2, 3]

追記

インスタンス変数ならば

ruby

1%w[one two three].each.with_index(1){|key, val| 2 instance_variable_set("@#{key}", val) 3}

でやれます。

投稿2019/05/08 12:27

編集2019/05/08 12:54
asm

総合スコア15147

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

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

harupi

2019/05/08 12:44

ご回答ありがとうございます。 なるほど。動的に新しいローカル変数を定義することは出来ないのですね。 補足情報についても勉強になりました。ありがとうございます。
guest

0

ベストアンサー

ruby

1a = ["one", "two", "three"] 2a.each_with_index{|v,k| 3 kk = "@#{v}" 4 vv = (k+1).to_s 5 eval("#{kk} = vv") 6} 7 8p @one

こんなかんじでしょうか?

投稿2019/05/08 12:16

tetsunosuke

総合スコア1292

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

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

asm

2019/05/08 12:40 編集

不必要なevalを使うべきではないかと思います。
harupi

2019/05/08 12:47

ご回答ありがとうございます。 インスタンス変数であればそのような方法で動的に定義可能なのですね。 勉強になりました。 私がやりたかったことに近いのは、どちらかといえばこちらなのでベストアンサーにさせて頂きます。
guest

0

なぜそんなことをする必要があると思ったのかを、別の手段がないか、もう一度考え直すと良いでしょう。

多くの場合は、HashArrayで対応するのが良いと思いますが、それも必要ない可能性もあります。

投稿2019/05/08 12:50

otn

総合スコア84505

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問