如何从包含模块的类中调用Ruby模块中的静态方法?

时间:2010-07-28 21:38:33

标签: ruby

是否可以在ruby中的模块中声明静态方法?

module Software
  def self.exit
    puts "exited"
  end
end

class Windows
  include Software

  def self.start
    puts "started"
    self.exit
  end
end

Windows.start

上面的例子不会打印出“退出”。

是否只能在模块中使用实例方法?

4 个答案:

答案 0 :(得分:31)

像这样定义你的模块(即make exit模块中的实例方法):

module Software
  def exit
    puts "exited"
  end
end

然后使用extend而不是include

class Windows
  extend Software
  # your self.start method as in the question
end

使用中:

irb(main):016:0> Windows.start
started
exited
=> nil

<强>解释

  

obj.extend(module, ...)增加了    obj 来自作为参数

的每个模块的实例方法

...因此,当在类定义的上下文中使用(类本身作为接收者)时,方法将成为类方法。

答案 1 :(得分:18)

将您的类方法放在嵌套模块中,然后覆盖“included”挂钩。只要包含模块,就会调用此挂钩。在钩子内部,将类方法添加到包含的任何人:

module Foo

  def self.included(o)
    o.extend(ClassMethods)
  end

  module ClassMethods

    def foo
      'foo'
    end

  end

end

现在任何包括Foo的类都会获得一个名为foo的类方法:

class MyClass
  include Foo
end

p MyClass.foo    # "foo"

任何非类方法都可以像往常一样在Foo中定义。

答案 2 :(得分:2)

需要更改两件事才能调用Windows.exit

  1. Software#exit需要是一个实例方法
  2. Windows需要extend Software,而不是include
  3. 这是因为extend另一个模块将该模块的实例方法作为当前模块的方法,而include模块将方法作为新实例方法。

    module Software
        def exit
            puts "exited"
        end
    end
    
    class Windows
        extend Software
    
        def self.start
            puts "started"
            self.exit
        end
    
    end
    
    Windows.start
    

    输出是:

    started
    exited
    

答案 3 :(得分:0)

可以在模块中包含静态方法:

module Software

  def self.exit
    puts "exited"

  end
end

Software.exit

运行此按预期打印'退出'。