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

2017-11-09 10:45:16来源:oschina作者:穿山人点击

分享
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的父类。


2 模块是不可以被new的,也就是说模块不能被实例化,所以模块是没有实例方法的。


3 模块可以直接调用自己的类方法和自己的常量


4 如果一个类需要使用模块的时候可以通过include和extend导入,此过程称之为Mix-in


5 include和extend的区别,使用include导入模块时模块中的类方法可以在类中被当作实例方法,


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


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


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


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台