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

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

スポンサーリンク

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

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

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

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

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

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

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

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

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

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

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

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

スポンサーリンク
私は以下の本で Ruby を覚えました。メタプログラミングRubyは入門を超える内容で難しめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!