3

次のようなルビークラスがあります。

class C
  @@v = 1

  class << self
    p @@v  # everything goes well here
  end
end

class << C
  # here I get an exception 
  # `singletonclass': uninitialized class variable @@v in Object (NameError)
  # from a.rb:5:in `<main>'

  p @@v
end

私の質問は次のとおりです。「オブジェクト (NameError) 内の初期化されていないクラス変数 @@v」という例外がありましたが、なぜ Ruby は Object(main) 内のクラス変数を検索するのですか?

ruby は常にメタクラスのクラス変数を外部で参照しているようです。

4

2 に答える 2

3

@@vclass のクラス変数を定義しましたC。次のことに驚くべきではありません。

class << C
  p @@v
end

は例外を発生させます。これは、クラス変数 を定義していないのシングルトン クラスを扱っているためです。C@@v

本当の問題は、このようにするとなぜうまくいくのかということです。

class C
  @@v = 1

  class << self
    p @@v
  end
end

その答えは、便宜上、クラス内からクラスのシングルトンにアクセスするたびに、 Ruby が透過的にそのクラスのクラス変数にアクセスできるようにすることです。

class << self; def method_nameこれは、構文を使用するか構文を使用するかに関係なく、メソッドを定義するときにも一貫して機能することに注意してくださいdef self.method_name

# assuming @@v in C is 1
class C
  def self.print_v_from_inside
    p @@v
  end
end

def C.print_v_from_outside
  p @@v
end

C.print_v_from_inside
# => 1

C.print_v_from_outside
# => NameError: uninitialized class variable @@v in Object
于 2013-05-06T13:40:03.133 に答える