ruby: использовать модуль include в экземпляре метода класса - PullRequest
2 голосов
/ 09 февраля 2011

Посмотрите на код ниже

initshared.rb
module InitShared
  def init_shared
    @shared_obj = "foobar"
  end
end

myclass.rb

class MyClass
  def initialize()
  end
  def init
    file_name = Dir.pwd+"/initshared.rb"
    if File.file?(file_name)
      require file_name
      include InitShared
      if self.respond_to?'init_shared'
        init_shared
        puts @shared_obj
      end
    end
  end
end

Включение InitShared не работает, поскольку оно внутри метода.

Я хочу проверить файл и затем включить модуль, а затем получить доступ к переменным в этом модуле.

Ответы [ 2 ]

9 голосов
/ 09 февраля 2011

Вместо использования

singleton_class.send(:include, InitShared)

от Самнанга вы также можете использовать

extend InitShared

. То же самое, но не зависит от версии.Он будет включать модуль только в собственный синглтон-класс объектов.

0 голосов
/ 09 февраля 2011
module InitShared
  def init_shared
    @shared_obj = "foobar"
  end
end

class MyClass
  def init
    if true
      self.class.send(:include, InitShared)

      if self.respond_to?'init_shared'
        init_shared
        puts @shared_obj
      end
    end
  end
end

MyClass.new.init

: include - это метод закрытого класса, поэтому его нельзя вызывать в методе уровня экземпляра.Другое решение, если вы хотите включить этот модуль только для конкретного экземпляра, вы можете заменить строку на: include с этой строкой:

# Ruby 1.9.2
self.singleton_class.send(:include, InitShared)

# Ruby 1.8.x
singleton_class = class << self; self; end
singleton_class.send(:include, InitShared)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...