1

我知道我可以导入 instance_methods,但是可以导入类方法吗?如何导入?

4

2 回答 2

4

一个常见的成语是这样的:

module Bar
  # object model hook. It's called when module is included. 
  # Use it to also bring class methods in by calling `extend`.
  def self.included base
    base.send :include, InstanceMethods
    base.extend ClassMethods
  end

  module InstanceMethods
    def hello
      "hello from instance method"
    end
  end

  module ClassMethods
    def hello
      "hello from class method"
    end
  end
end

class Foo
  include Bar
end

Foo.hello # => "hello from class method"
Foo.new.hello # => "hello from instance method"

InstanceMethods 模块有什么用?

当我需要模块在我的类中包含实例和类方法时,我使用两个子模块。通过这种方式,方法被整齐地分组,例如,可以在代码编辑器中轻松折叠。

感觉也比较“统一”:两种方法都是从self.includedhook中注入的。

无论如何,这是个人喜好的问题。此代码的工作方式完全相同:

module Bar
  def self.included base
    base.extend ClassMethods
  end

  def hello
    "hello from instance method"
  end

  module ClassMethods
    def hello
      "hello from class method"
    end
  end
end
于 2013-01-11T15:16:40.187 回答
2

简短的回答是:不,您不能使模块对象本身的方法(模块的“类”方法)位于另一个对象的继承链中。@Sergio 的答案是一种常见的解决方法(通过将“类”方法定义为另一个模块的一部分)。

您可能会发现以下图表具有指导意义(点击查看完整尺寸或获取 PDF):

Ruby 方法查找流程
(来源:phrogz.net

注意:此图尚未针对 Ruby 1.9 进行更新,其中有额外的核心对象BasicObject,例如稍微改变根流。

于 2013-01-11T15:48:05.750 回答