ruby中的模块(require,load,include,extend)
模块是ruby组织代码的方式,提供命名空间的支持,类似于java中的包,但其功能更复杂一些
模块例子:
module MyModule
#为了可以直接调用所有使用了类方法的定义
def self.module_function
puts "模块方法module_function"
end
end
module MyModule
CONST = "模块中的常量"
module MySubModule
CONST = "子模块中的常量"
end
end
MyModule.module_function
#或者MyModule::module_function也可以调用模块中的方法
puts MyModule::CONST
puts MyModule::MySubModule::CONST
创建好模块后,下一步就是在其他的地方加载或者混入模块。ruby中有4个方法可以实现这些功能require,load,include,extend
require和load的功能是加载相应的模块文件到当前环境中。load不管之前是否已经加载过而直接包含源代码文件。require则进行检查,保证只加载一次。
用法如下
load 'yaml.rb'
require 'yaml'
include和extend的作用是将模块混入或者扩展已有的模块或者类
用法如下
module MyModule
def module_method
puts "module_method"
end
end
class MyClass1
include MyModule
end
class MyClass2
#相当于self.extend MyModule
extend MyModule
end
myclass1 = MyClass1.new
#类中使用include,模块中的方法变成了实例方法
myclass1.module_method
#类中使用extend,模块中的方法变成了类方法
MyClass2.module_method
ss="aaa"
#所有对象都可以extend模块而获得模块中的方法,因为extend属于Object中的方法
ss.extend(MyModule)
ss.module_method
#总结:在类中extned模块则模块中的方法变为类方法,在对象上extend模块则模块中的方法成为实例方法
动态特性
ruby的动态特性体现在以下几个方面
1.动态执行字符串的代码
2.动态获得模块或类中的常量和变量值
3.动态为类或对象添加方法
4.对未知变量和方法的动态处理
5.动态删除定义
动态调用对象的方法
"abcd".upcase #返回ABCD
my_method = "upcase"
puts "abcd".send(my_method) #输出ABCD
my_method = "downcase"
puts "ABCD".send(my_method) #输出abcd
动态获得模块或类中的方法,常量,变量值
#methods是Object中的方法,他返回对象所包含所有的公开方法名称。结果为一个数组
puts String.methods.length
#同理instance_methods返回的是所有的实例方法
puts String.instance_methods.length
#method_defined?用来检查是否对象定义了相应的方法
puts String.method_defined? "reverse"
#respond_to?用了检查类是否能够响应某实例方法的调用
puts "sss".respond_to? "upcase"
#根据常量的名称获得模块或类中常量的值
name = "PI"
puts Math.const_get(name)
#根据类的名称创建类的实例
class_name = "Array"
my_array = Object.const_get(class_name)
#输出数组的长度
puts my_array.new.length
动态定义方法
class MyClass
def self.new_method(name,&block)
#调用module的私有方法define_method
define_method(name, &block)
end
end
MyClass.new_method("my_new_method") {puts "这是动态定义的方法"}
my_class = MyClass.new
my_class.my_new_method
调用未知方法的处理
method_missing介绍,当调用的方法不存在时执行
class MyClass
def method_missing(name)
puts "方法#{name}尚未定义!"
end
end
MyClass.new.unknown_method
#输出 方法#{name}尚未定义!
动态删除方法
取消定义方法的关键字是undef。module类中还提供了remove_method,undef_method,remove_const方法。其中remove_method只能删除当前的方法定义,而undef_method则连带父类的方法定义一并删除
例子:
def test_function
puts "test_function"
end
#取消方法的定义
undef test_function
class MyClass
def method1
puts "method1"
end
def method2
puts "method2"
end
end
#继承类MyClass
class MySubClass<MyClass
#当调用的方法不存在是被调用
def method_missing(name)
puts "方法#{name}未定义!"
end
def method1
puts "submethod1"
end
def method2
puts "submethod2"
end
#移除当前类的method1方法的定义
remove_method("method1")
#取消方法method2的定义,包括父类中的定义
undef_method("method2")
end
sub_class = MySubClass.new
sub_class.method1 #输出method1
sub_class.method2 #输出方法method2未定义!