Ruby之Symbol
Symbol.all_symbols查看Ruby可以在运行是动态增加和删除一个方法,使用define_method,remove_method,使用method_defined?来确定是否定义了某方法
Ruby之Module
Ruby中Module类似于Class,其superclass为Object,class为Class,只是Module不能实例化,不能继承,但是可以让一个类继承与一个module。Module主要有两个作用,一是作为命名空间;二是,Ruby中是单继承关系,Module用来解决多继承问题,Module对外是不可见。Ruby库中包含Math,Kernel模块
module MyModule
A = "a"
def method
end
def MyModule.moduleMethod
end
end
MyModule::A
MyModule.moduleMethod
include MyModule
method
include只是将module中的instance method导入,而模块函数则没有;类如果包含了模块,则类和类实例都可以访问模块实例方法模块的局部变量是对外不可见的,即使是外部调用模块实例方法,其方法引用局部变量也不可以:
x = 1
module Foo
x = 50
def no_bar
return x
end
def bar
@x = 1000
return @x
end
puts "In Foo: x = #{x}"
end
include Foo
puts x
#puts no_bar
puts bar
module可以有实例变量,模块函数可以访问:
module X
@instvar = "@instvar"
def self.aaa
puts @instvar
end
end
X.aaa
module X
@instvar = "@instvar"
@@classvar = "@classvar"
def amethod
@instvar = 10
puts @instvar
end
def self.aaa
puts @instvar
end
end
include X
X.aaa
puts @instvar
amethod
puts @instvar
@instvar = "hello world"
puts @instvar
X.aaa
puts @@classvar
@@classvar = "bye"
puts @@classvar
可以使用X.instance_variables和self.instance_variables查看变量信息如果两个module有相同的实例方法,则取决于include的顺序,会引入后include的方法。为避免覆盖,使用alias newMethodName methodName
require用于引用一个文件,其搜索路径为$:,或者使用load方法
require “mod.rb"和load("mod.rb", true)的区别:
- load把代码以一个匿名模块导入
- require只load文件一次
- Comparable: 需要实现<=> 并且根据它实现< <= == >= > between?
- Enumerable: 需要实现each
- FileTest: 访问File类
- GC: Ruby的垃圾回收,ObjectSpace模块
- Kernel: 由Object类包含,build-in方法
- Math
- ObjectSpace: 垃圾回收相关,可以遍历当前对象
- Precision
- Process
- Signal
extend对对象进行模块的扩展,而不影响其类,如果扩展的方法和类方法相同,则覆盖类方法:
module MyModule
def amethod
end
end
class MyClass
def method
end
end
ob = MyClass.new
ob.extend(MyModule)
ob.amethod
ob.freeze用于禁止extend,可以用frozen?来测试
No comments :
Post a Comment