標準クラス・モジュール > Object > instance_eval
obj.instance_eval { block }
instance_eval
メソッドは、渡されたブロックをレシーバのインスタンスの元で実行します。ブロックの戻り値がメソッドの戻り値になります。
ブロック内では、インスタンスメソッド内でコードを実行するときと同じことができます。ブロック内でのself
はレシーバのオブジェクトを指します。なお、ブロックの外側のローカル変数はブロック内でも使えます。
Ruby 1.9 Ruby 1.9では、instance_eval
メソッドはBasicObject
に移されました(この変更はRuby 1.8用に書いたプログラムに特に影響はありません)。
次の例では、instance_eval
メソッドに渡したブロック内でインスタンス変数やprivate
メソッドを利用しています。
class Cat def initialize(name) @name = name end private def hello "meow..." end end cat = Cat.new("Piko") puts cat.instance_eval { @name + ": " + hello }
Piko: meow...
Ruby 1.9 Ruby 1.8ではブロック引数でレシーバのオブジェクトを取り出せますが、Ruby 1.9ではブロック引数はなくなりました。代わりにself
を使います。
cat = Cat.new("Piko") cat.instance_eval {|obj| p obj }
#<Cat:0x3b4f180 @name="Piko"> (Ruby 1.8の場合)
obj.instance_eval(code [, filename [, lineno]])
instance_eval
メソッドの引数に文字列codeを渡すと、その文字列をコードとしてレシーバのインスタンスの元で実行します。
cat = Cat.new("Piko") puts cat.instance_eval('@name + ": " + hello')
Piko: meow...
第2引数と第3引数には例外のバックトレース情報を指定できます。第2引数filenameにはファイル名を、第3引数linenoには行番号を指定します。
cat = Cat.new("Piko") cat.instance_eval('@name + ": " + goodbye', 'instance_eval', 99)
instance_eval:99: undefined local variable or method `goodbye' for #<Cat:0x3afee 88 @name="Piko"> (NameError)
instance_exec
: インスタンスの元でコードを実行。Ruby 1.8.7class_eval, module_eval (Module)
: クラスやモジュールの元でコードを実行。eval (Kernel)
: 文字列をコードとして実行。