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'

なぜこうなった。

4

1 に答える 1

0

ここでいくつかのことを.... のインスタンス メソッドinstanceを定義しましたBasicObject。次に、オブジェクトでこのインスタンス メソッドを呼び出し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
于 2012-05-05T14:25:00.280 に答える