機略戦記

Maneuver warfare

スコープの外からインスタンス変数を操作

前回、privateメソッドをスコープの外から操作する方法を紹介したが、今回は(getterやsetterが用意されていない)インスタンス変数に、スコープの外からアクセスする方法について書く。

例えば、以下のクラスの@instance_variableは、普通、インスタンスの外部からは読みも書きも出来ないが、今回紹介する方法を使うとできるようになる。

やりかた

やりかたから書くと#instance_evalで@instance_variableにアクセスできる

しくみ

#instance_evalは、ブロックとして渡したコード*をレシーバーのコンテキストで実行するメソッドだ。

例えば、example.instance_eval{ p @instance_variable }を実行すると、あたかも、ブロックで渡した"p @instance_variable"と言うコードが、Exampleクラスのインスタンスメソッドとして定義されて、それが実行されたかのような振る舞いをする。
イメージとしてはこんな感じだ。

Exampleのインスタンスメソッドであれば、Exampleのインスタンス変数である@instance_variableにアクセス出来ると言うわけだ。

ちなみに、前回、private メソッドも呼び出す方法としてsendを紹介したが、sendを使わなくてもinstance_evalを使えばprivateメソッドを呼び出せる。が、sendの方がタイプ数が少ないし、例えデバックや動作確認の時でもインスタンス変数を書き換える事が余り無いので、私はほとんどsendしか使っていない。


*文字列でコードを渡す事もできる