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
またはを使用する場合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
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