我想从模块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
答案 0 :(得分:5)
使用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"
答案 1 :(得分:3)
我发现here是一种解决问题的方法,但对我来说看起来并不好看:
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"
答案 2 :(得分:0)
你可以试试这个“怪异”的代码:
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