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

当使用extendorinclude时,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 回答