在另一个模块内扩展模块

时间:2013-01-04 14:18:42

标签: ruby

我想从模块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 个答案:

答案 0 :(得分:5)

使用extendinclude时,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