2

考虑:

module A
  def self.a; puts "a"; end;
  def aa; A.a; end;
end
include A
aa
a

aa有效但无效a。是否有一个技巧可以让你像A.a一样a可用一样可用?我怀疑方法是为每个方法编写一个方法,但是有避免这种情况的技巧吗?include MathlogMath.logaself.a

4

3 回答 3

1

根据其他人的回答,我想我想要的是:

module A
  module Functions
    def a
      puts 'a'
    end
  end
  extend Functions
end
# a is a module function of A
A.a
# Explicitly include these functions into one's instance
include A::Functions
a

现在可以包含A而不用方法污染它们的实例空间......除非明确地这样做include A::Functions

于 2013-06-08T16:31:55.290 回答
1

你可能在找extend self吗?

module A
  def a; puts "a"; end;
  extend self
end

A.a

include A
a
于 2013-06-08T15:38:53.683 回答
0

如果您可以访问模块源代码,则有一个窍门,如果您没有,仍然有一个窍门。如果你这样做,这将是模块A

module A
  def a
    puts 'a!'
  end
  module_function :a
end

所有这些都将调用a

A.a
include A; a

即使您无权访问模块的源代码,也可以通过少量(大量)元编程来实现:

SomeMod.instance_methods(false).each {|method| SomeMod.__send__(:module_function, method.to_sym)}

这仅在方法仅在原始模块中定义为实例方法时才有效。

如果您想将它们定义为类方法并且仅在包含时创建实例:

module A
  def self.a
    puts 'a'
  end
  def self.included(klass)
    A.singleton_class.instance_methods(false).each do |m|
      klass.__send__(:define_method, m.to_sym) do |*args|
        A.__send__(m.to_sym, *args)
      end
    end
  end
end
于 2013-06-08T15:32:37.977 回答