如何在ruby类中调用与实例方法和类方法相同的模块方法

时间:2019-03-30 03:37:53

标签: ruby

我想调用与类方法相同的模块方法以及Ruby类中的实例方法。例子

module Mod1
  def method1
  end
end

class A
end

我想像这样调用method1   A.new.method1或   A.method1

2 个答案:

答案 0 :(得分:2)

如@Karthik所述,您可以将模块includeextend用作模块:

module Mod1
  def method1
    'hi'    
  end
end

class A
end

A.include Mod1
A.extend Mod1

A.new.method1 #=> 'hi'
A.method1     #=> 'hi'

A.extend Mod1只不过是

A.singleton_class.include Mod1

要做到这一点,通常会看到如下所示的模块。

module Mod1
  def method1
    'hi'
  end      
  def self.included(klass)
    klass.extend(self)
  end
end

在这种情况下,该模块仅需由类include>

class A
end

A.include Mod1

A.new.method1 #=> 'hi'
A.method1     #=> 'hi'

Module::included被称为回调 hook 方法。 A.include Mod1使Mod1::included等于klass的{​​{1}}并且等于A的{​​{1}}执行。

顺便说一句,还有几种其他的回调方法可以用来达到良好的效果。可以说,最重要的是Module::extendedModule::prependedClass::inherited

答案 1 :(得分:1)

我无法想象这是一个好的设计。.但是您可以尝试将includeextend两者都放入类中。 include将方法添加为实例方法,而`e http://www.railstips.org/blog/archives/2009/05/15/include-vs-extend-in-ruby/