Ruby 的 include 和 included

Ruby 提供了混入(Mixin)的方式使用模块(Module),它可以让被混入的模块中的代码被其他类或者模块使用。

本章节我们将讲解其中一种混入方式:include

1. include

include将会把模块里的方法包含进被执行的类的实例方法中。

实例:

module Person
  def name
    "My name is Andrew"
  end
end

class Member
  include Person
end

puts Member.new.name

# ---- 输出结果 ----
My name is Andrew

解释:当类Member包含了模块Person之后,类Member增加了一个名为name的实例方法(类实例后可调用的方法)。

2. included

当我们include了一个模块后,模块被包含后会调用一个钩子方法,这个方法名为included

让我们为模块Person增加一个钩子方法。

实例:

module Person
  def self.included(klass)
    puts "#{klass} included #{self}"
  end
  
  def name
    "My name is Andrew"
  end
end

class Member
  include Person
end

puts Member.new.name

# ---- 输出结果 ----
Member included Person
My name is Andrew

解释:当模块Person被包含后,触发了included钩子方法,打印了“Member included Person”。

3. 小结

本章节我们学习了include,当类include一个模块的时候,会将模块中定义的方法填充进类的实例方法中,另外,当一个模块被include的时候,会触发included回调,并返回操作的类名。