include and extend in Ruby

Include is for adding methods to an instance of a class and extend is for adding class methods. Let’s take a look at a small example.

在教科书中,include增加方法为实例方法,extend增加方法为类方法。

我的一点观察如下,不知道对不对。 增加方法到当前作用域的下一级 增加方法到当前作用域的同一级

通过以下例子来证明

下面是一个模块


# file : A.rb
module Test
  attr_accessor :name, :age

  # def name
  #   @name
  # end
  #
  # def age
  #   @age
  # end
end

方式一:如下的include方式可以正常工作


# file: main.rb

require './A.rb'

class A
  include Test
  def initialize(name, age)
    @name = name
    @age = age
  end
end

a = A.new("maxwell", 30)
p a.age
p A.ancesotrs # => [A, Test, Object, Kernel, BasicObject]

方式二:如下的extend方式也可以正常工作


# file: main.rb

require './A.rb'

class A
  #include Test
  def initialize(name, age)
    extend Test
    @name = name
    @age = age
  end
end

a = A.new("maxwell", 30)
p a.age
p A.ancesotrs # => [A, Object, Kernel, BasicObject]

include 不能包含模块中的以self开头的的方法,这样nickname1这个方法不会出现在任何类中。

module Naming
  def self.nickname1
    "self.name in Naming"
  end
end