我想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
我想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
当使用extend
orinclude
时,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
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"
你可以试试这个“奇怪”的代码:
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