2

私は次のようなモジュールを持っています

module MyModule
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def foo
      @@var = 1
    end

    def bar
      puts @@var
    end
  end
end

class A
  include MyModule
  foo
end

class B < A; end

となることによって

 B.bar outputs '1'.

ただし、.fooが呼び出された場合にのみ.barを定義したいと思います。私は試した

module MyModule
  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def foo
      @@var = 1
      extend SingletonMethods
    end

  module SingletonMethods
    def bar
      puts @@var
    end
  end
end

問題はそれです

B.bar

エラー「MyModule::SingletonMethodsの初期化されていないクラス変数@@var」を返します。.fooで定義された変数を.barで使用できるようにするにはどうすればよいですか?

4

2 に答える 2

1

代わりにmattr_accessorを使用してください

于 2010-11-02T09:44:02.513 に答える
0

自己構文を使用して、モジュールからクラス変数にアクセスできました

class User
  include Base
  @@attributes = [:slug, :email, :crypted_password]
end

module Base
  def self.included(base)
  base.extend ClassMethods
end

def headers
  if defined? self.attributes
    self.attributes
  end
 end
end

今呼び出すとUser.headers私に期待される結果が得られます [:slug, :email, :crypted_password]

誰かがこれがルビーで正確に機能する理由をもっと明らかにすることができるなら、私に知らせてください!

于 2012-11-11T19:30:17.987 に答える