Расширить модуль внутри другого модуля

Я хочу вызвать метод a из метода модуля B. Как мне это сделать? Я не хочу указывать A::a каждый раз.

module A
 def self.a
 "a"
 end
end
module B
 extend A
 def self.b
 a
 end
end
p B::b # => undefined local variable or method `a' for B:Module
3 ответа

Я нашел здесь метод его решения, но мне это не выглядит хорошо:

module A 
 module ClassMethods
 def a
 puts "a"
 end
 end
 extend ClassMethods
 def self.included( other )
 other.extend( ClassMethods )
 end
end
module B
 include A
 def self.b
 a
 end
end
p B::b # => "a"


При использовании extend или include, Ruby будет смешивать только методы экземпляра. Extend будет смешивать их как методы класса, но он не будет смешиваться в методах класса. Таким образом, простое решение по вашему запросу:

module A
 def a ## Change to instance
 "a"
 end
end
module B
 extend A
 def self.b
 a
 end
end
p B::b #=> "a"
p B.b #=> "a"


Вы можете попробовать этот "странный" код:

module A
 def self.a
 "a"
 end
end
module B
 extend A
 def self.method_missing(name, *args)
 if name =~ /a/
 A::a *args
 else
 raise "MethodMissed: #{name}"
 end
 end
 def self.b
 a
 end
end
p B::b

licensed under cc by-sa 3.0 with attribution.