Rubyリファレンス: Home

instance_eval (Object)

Edit   History

標準クラス・モジュール > 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)

関連項目