模块案例
与类不同的是,模块没有实例对象的概念,使用MyModule.new会报错
module MyModule
def self.module_function
puts "这是模块方法"
end
end
module MyModule
CONST = "这是模块中的常量"
module MySubModule
CONST = "这是子模块中的常量"
end
end
puts MyModule.class # 输出为Module
MyModule.module_function # 输出 这是模块方法
# 还可以用::来引用模块中的模块或方法
MyModule::module_function # 输出这是模块的方法
puts MyModule::CONST
puts MyModule::MySubModule::CONST
加载和混入模块(require、load、include、extend)
require和load的用法
如果传入的文件不包含的路径,lode和require会自动在当前的加载目录中(加载目录都存储在全局数组 $:
中)
load 'filename.rb' # 加载filename.rb文件
require 'yaml' # 加载yaml库,通常也是加载yaml.rb文件
include和extend不会自动加载文件,他们的作用只是将模块混入或扩展到已有的模块或者类。
module MyModule
def module_method
puts "module_method"
end
end
class MyClass
include MyModule
end
class MyClass1
extend MyModule
end
my_class = MyClass.new
# 类中使用include,模块中的方法变成了实例方法
my_class.module_method
# 类中使用的extend,模块中的方法变成了类方法
MyClass1.module_method
# 所有对象都可以extend模块 而获得模块中的方法
aa = 123
aa.extend(MyModule)
aa.module_method
网友评论