Как модуль может определить статическое свойство, которое не используется разными классами, которые его включают? - PullRequest
0 голосов
/ 20 января 2011

Если я определю модуль следующим образом:

module M
   @@p = []

   def self.included( base )
      def base.add( a )
          @@p += a
      end
   end

   def show_p
       @@p
   end
end

, тогда каждый класс, включающий модуль, будет иметь одинаковый массив @@ p:

class A
   include M
end
class B
   include M
end

A.add "a"
B.add "b"

B.new.show_p

?> ["a", "b"]

Можно ли определитьуникальное статическое свойство для каждого отдельного класса, включающего модуль, чтобы классы не мешали друг другу?то есть, чтобы я мог сделать это:

A.add "a"
B.add "b"

A.new.show_p

?> "a"

B.new.show_p

?> "b"

Спасибо!

1 Ответ

0 голосов
/ 20 января 2011

Вместо создания статического свойства определите свойство для самого объекта класса:


module Foo
  def self.included(base)
    base.instance_variable_set(:@p, [])
    class << base
      attr_reader :p
      def add(a)
        @p << a
      end
    end
  end
end

class First
  include Foo
end

class Second
  include Foo
end

require 'pp'
First.add "a"
Second.add "b"
pp First.p
pp Second.p


Выход:

["a"]
["b"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...