Ruby中模块导入 以及include和extend的区别

module MathMatica
  PI = 3.14
  def self.clazz_fun
    puts "模块能够使用类方法"
  end
  #模块由于没法实例化因此用不了实例方法
  def hello
    puts "模块中的实例方法"
  end
end
#模块直接调用常量
puts MathMatica::PI
#模块使用类方法
puts MathMatica.clazz_fun
#须要使用这个模块时候将这个模块导入进来称为Mix-in
class Student
  attr_accessor :name, :old, :sex
  include MathMatica#把模块注入目标类或者模块做为实例方法
  extend MathMatica#把模块注入目标类或者模块做为类方法
  class << self
    def clazz_fun2
      puts "Student类中的类方法"
    end
  end
  def initialize(name, old, sex)
    @name = name
    @old = old
    @sex = sex
  end

  def say_hi
    puts "类的实例方法"
    hello#类中使用include导入能够使用模块的实例方法
    self.hello
    # self.clazz_fun2
    # clazz_fun2 实例方法中不能调用类方法
  end
end
Student.clazz_fun2 #类能够调用类方法
Student.hello
puts Student::PI #类能够使用模块中的常量
# Student.clazz_fun
# Student.say_hi#实例不能调用类方法
s = Student.new("huge", 20, "女")
s.say_hi
s.hello
# s.clazz_fun2 Obj不能调用类方法

1 模块是类Class的父类。code

2 模块是不能够被new的,也就是说模块不能被实例化,因此模块是没有实例方法的。it

3 模块能够直接调用本身的类方法和本身的常量class

4 若是一个类须要使用模块的时候能够经过include和extend导入,此过程称之为Mix-inmodule

5 include和extend的区别,使用include导入模块时模块中的类方法能够在类中被看成实例方法,sso

使用extend导入模块,模块中的类方法在被导入的类中也被看成是类方法。方法

6 被导入模块中的类能够使用模块的常量和方法(方法以实例方法来使用仍是以类方法来使用取决于导入时使用用include仍是用extend导入)注入

7 类不能使用实例方法,Obj不能使用类方法co

相关文章
相关标签/搜索