如何判断模块中的方法是实例方法还是class方法

How to tell if a method in a module is instance method or class method

我了解 include 创建实例方法,extend 创建 class 方法。我们如何判断一个方法是实例还是 class 方法?

在下面的例子中,看起来一个方法是一个实例方法和一个class方法。在某些情况下实例和 class 方法之间没有区别吗?

module Test
  def aux
    puts 'aux'
  end
end

class A
  include Test
end

class B
  extend Test
end

a = A.new
a.aux
B.aux

includeextend 之间的区别在于混合模块的 class 的行为方式。 includeextend 都只适用于模块的 'instance' 方法(即不以 ModuleName 或 self 开头的方法)

示例:

module Foo
  def a
    puts "a"
  end

  def Foo.b
    puts "b"
  end

  def self.c
    puts "c"
  end
end

a class 包含 此模块将只能访问 a 作为 实例方法 而一个 扩展 它的 class,同时只能作为 class 方法 访问 a。两者都无法访问 bc,因为它们是 Foo 的 class 方法,只能通过调用 Foo.bFoo.c

来访问