2012-05-05 2 views
0
BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}=#{ins}", binding 
    end 
end 

問題のコードはありますか。私がしたいことは、次のコードで、クラスFooの内部に新しいインスタンス変数barを作成することです。 私はこのコードを実行した後に何を得る:これはなぜエラーを返すのですか?

class Foo 
    bar = 3 
end 
Foo.instance(:bar) 

は次のとおりです。

NameError: undefined local variable or method `bar for Foo:Class 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `eval' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 

がなぜこの出来事です。

+0

前の質問と同じ理由で - クラス宣言が処理された後は「バー」は存在しません。 –

答えて

0

ここにいくつか.... BasicObjectのインスタンスメソッドinstanceを定義しました。次に、Fooオブジェクトでこのインスタンスメソッドを呼び出します。 Fooオブジェクトはクラスです。 Fooオブジェクトのインスタンス変数は設定していません。 @符号を使用してインスタンス変数を設定します。 instanceメソッドは、インスタンス変数@insをそれ自身に設定します。

bindingは、現在の変数バインディングを返すメソッドであるため、, bindingはここでは必要ありません。保存された「環境」を渡す必要がある場合は、bindingを保存する必要があります。 , bindingが何かを傷つけることはありませんが、冗長です。

BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}= @#{ins}", binding  # @ after the '=' 
    end 
end 



class Foo 
    @bar = 3  # @ here 
end 
Foo.instance(:bar) 
puts Foo.instance_variable_get("@bar") # Shows the instance variable @bar for Foo object 
関連する問題