Изучение модуля, вызывающего оригинальный модуль - PullRequest
3 голосов
/ 04 марта 2012

Как я могу позволить модулю, который будет включен другим модулем, искать константу внутри включающего модуля?Другими словами, как я могу заставить B.foo и D.foo ниже дать ожидаемые результаты?

module A
    module_function
    public
    def foo; C end
end
module B
    extend A
    C = "foo in B"
end
module D
    extend A
    C = "foo in D"
end

B.foo #=> (Expected) "foo in B"
D.foo #=> (Expected) "foo in D"

Ответы [ 3 ]

3 голосов
/ 04 марта 2012

Вы должны указать ему поиск C в контексте, где A равно extend ed в:

module A
  def foo
    self::C
  end
end

module B
  extend A
  C = "foo in B"
end

module D
  extend A
  C = "foo in D"
end

B.foo #=> "foo in B"
D.foo #=> "foo in D"
2 голосов
/ 04 марта 2012

Я рекомендую создать инициализатор атрибута, который может использоваться другими модулями:

module A
  # This is actually executed in the context of each individual object.
  # Since all modules and classes are also objects, each module extended
  # by A gets to set its own state which the other methods can then use.
  def attribute(*args)
    @value = args.first if args.any?
    @value || :default
  end

  def foo
    attribute.to_s
  end
end

module B
  extend A
  attribute :from_B
end

module C
  extend A
  attribute :from_C
end

module D
  extend A
end

B.foo  # => "from_B"
C.foo  # => "from_C"
D.foo  # => "default"
0 голосов
/ 04 марта 2012

Вы не можете сделать это с константами, потому что они не наследуются, но вы можете с помощью методов:

module A
  def foo
    c
  end
end

module B
  extend A
  def self.c
     "foo in B"
  end
end

module D
  extend A
  def self.c
    "foo in D"
  end
end

B.foo #=> "foo in B"
D.foo #=> "foo in D"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...