1

外部から (attr_accessor を介して) クラスのクラス変数を設定し、そのオブジェクトの 1 つの内部からアクセスしたくありません。Ruby 1.9.2 を使用しています。これは私のコードです:

class Service
  def initialize(id)
    @my_id = id   
  end

  class << self
    attr_accessor :shared_id
  end

  def system_id
    @my_id + @@shared_id
  end
end

を設定Service.shared_id = "A2"してから呼び出すとService.new("A").system_id、「AA2」は返されません。次のエラーが表示されます。

サービス内の初期化されていないクラス変数 @@shared_id

Service.service_id を設定しなかった場合と同様の動作です。誰かがなぜこれが起こるのか説明できますか?

4

3 に答える 3

5

attr_accessorインスタンス変数を操作するメソッドを作成します — インスタンス変数やクラス変数は作成しません。クラス変数を作成するには、何かに設定する必要があります。

@@shared_id = something

クラス変数のアクセサーを生成するヘルパー メソッドがないため、自分で作成する必要があります。

ただし、クラス変数は、奇妙なルックアップ ルールのため、めったに使用されず、回避されることさえあります。代わりに、クラス レベルのインスタンス変数が使用されます。

class Service
  @shared_id = thing

  class << self
    attr_accessor :shared_id
  end

  def system_id
     # use self.class.shared_id; you could add a shared_id helper to generate it, too.
  end
end
于 2011-08-26T06:22:30.323 に答える
4

どうcattr_accessorですか?

于 2011-08-26T08:23:16.763 に答える
0

@@class_varすべてのクラスでグローバルであることを忘れないでください。

于 2011-08-26T08:16:56.463 に答える