Rubyで連番の変数を動的に作成

スポンサーリンク

Rubyで(というかRailsのRSpecテストで)、連番を振った変数を動的に作成したい機会があったのですけど、Rubyの知識不足でちょっとはまったので備忘録。

【お知らせ】 英単語を画像イメージで楽に暗記できる辞書サイトを作りました。英語学習中の方は、ぜひご利用ください!
画像付き英語辞書 Imagict | 英単語をイメージで暗記
【開発記録】
英単語を画像イメージで暗記できる英語辞書サービスを作って公開しました
スポンサーリンク

eval 内の評価によるローカル変数のスコープはブロックの場合と同じ

原因は以下の引用による部分。

expr の中のローカル変数の扱いはブロックの場合と同じです。すなわち、eval 実行前に補足されていた変数は eval 実行後にブロック外に持ち出せます。

いきなり動的に変数を宣言して代入する場合。ここでは、eval で動的に name という変数を宣言し “taka” という値を代入しています。

eval を抜けた後に、name を参照しようとするとエラーになる。

name という変数を先に宣言しておき、その後 eval で動的に代入する場合。

こうすると、eval を抜けた後に name を参照できます。引用したドキュメントの通りの挙動です。しかし、この方法は動的に代入するための変数を先に宣言しなきゃならないので、連番の変数をたくさん作る場合はあまり旨みがない…。

インスタンス変数を動的に作成する

ということで、インスタンス変数を使いました。

変数名に @ を付けてインスタンス変数を動的に作成すると、先に宣言しなくても変数のスコープが広がり eval を抜けた後も参照できます。ただし、利用するコンテキストで他のインスタンス変数と被らないようになど配慮が必要になる。

以下、pry で0〜9まで連番を振ったインスタンス変数を動的に作成する例。

以上です。if, while, for などと同様に、Rubyで変数のスコープにちょっと注意しないといけないケースですね。

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
 
スポンサーリンク

Leave Your Message!