2

この部分は機能します:

 class Example1
   @@var1= "var1 in the Example1"
   def get_var1
     @@var1
   end
 end

 example1 = Example1.new
 example1.get_var1
 # => "var1 in the Example1"

しかし、固有クラスを試してみると:

def example1.get_var1
  @@var1
end

example1.get_var1
# NameError: uninitialized class variable @@var1 in Object
# from (pry):128:in `get_var1'

Ruby は@@var1Object代わりに を検索しExampleます。

このコードを Ruby 1.9.3 と 2.0 でテストしましたが、結果は同じでした。

なぜそれが起こるのですか?
2 つ目は、オフにできexample.get_var1ますか (オブジェクト内のクラス変数を検索しません)。

4

1 に答える 1

7

クラス変数ルックアップのレキシカル スコープが奇抜なように見えます。あなたは中にいないので、私が知る限り近くにいます

class Example1
end

ブロックすると、ruby はクラス内で @@var を検索するのではなく、Object から検索します。クラスから明示的に必要な場合は、次のことができます。

def example1.get_var
    self.class.class_variable_get(:@@var1)
end

答えを探しているときに、https: //www.ruby-forum.com/topic/1228428 に出くわしました。彼らは 1.8.7 について話していますが、それ以降のバージョンにも適用されるようです。

于 2014-07-01T13:51:11.400 に答える