5

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
4

3 に答える 3

7

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"
于 2013-01-04T14:39:36.653 に答える
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"
于 2013-01-04T14:28:39.353 に答える
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
于 2013-01-04T15:51:56.890 に答える