像Math这样的Ruby类方法可以作为包含的实例方法使用吗?

像Math这样的Ruby类方法可以作为包含的实例方法使用吗?,ruby,class,methods,include,Ruby,Class,Methods,Include,考虑: module A def self.a; puts "a"; end; def aa; A.a; end; end include A aa a aa有效,但不a。有没有一个技巧可以让a.a像include Math让log像Math.log那样可用?我怀疑方法是为每个自身编写a方法。a方法,但有什么技巧可以避免这种情况吗?如果您可以访问模块源代码,则会有技巧,如果您没有,则仍然会有技巧。如果这样做,这将是模块A: module A def a puts 'a!'

考虑:

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

aa
有效,但不
a
。有没有一个技巧可以让
a.a
include Math
log
Math.log
那样可用?我怀疑方法是为每个
自身编写
a
方法。a
方法,但有什么技巧可以避免这种情况吗?

如果您可以访问模块源代码,则会有技巧,如果您没有,则仍然会有技巧。如果这样做,这将是模块
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

您可能正在寻找
扩展self

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

A.a

include A
a

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

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
,而不会用方法污染实例空间。。。
除非使用
显式地这样做,否则包含A::Functions

是的,但是请参见。如果将类方法带到实例上,这将是完美的。。。但知道同样的事情真的很好。谢谢我非常确信,通过定义类方法和使用
include self
可以做到这一点。我个人更喜欢另一种方式。:-)谢谢,你的两个回答引导我找到了我想要的东西。这正是我所需要的。我正在编写模块函数,如果有人希望包含函数,我希望他们能够给出函数名,而不使用函数的全名。因为函数不是实例方法,所以我不想这样定义它们。@user1494787:从一个类到另一个实例没有很好的方法。数学使用模函数方法(我认为),这样做可能更容易。或等一下。。。