打开类
通过
class String
def to_alphanumeric
gsub /[^\w\s]/,''
end
end
可以直接打开已有的类并给其添加方法,class关键字的核心任务是把你带入到类的上下文中,让你可以定义其中的方法。
如果方法名重合,那么会覆盖原来的方法,这称为“猴子补丁(Moneypatch)”。
对象和方法
class MyClass
def my_method
@v=1
end
end
obj = MyClass.new
obj #=> <MyClass:0x007f8e42830838 @v=1> #obj作为一个实例对象包含一个实例变量@v和一个类MyClss
obj.class #=>MyClass
obj.my_method
obj.instance_variables #=>[:@v]
obj.methods.grep(/my/) #=>[:my_method]
MyClass.instance_methods(false) #=>[:my_method]
MyClass.methods.grep(/my/) #=>[]
#通过对比可以看出,my_method是MyClass的一个实例方法,只有当MyClass实例化后才能调用,MyClass类本身并没有这个方法。
MyClass.class #=>Class
#类也是对象,它包含一个叫Class的类。
类与模块
Class.superclass #=>Module
#Class的超类是Module,Class实际就是一个增加了new(),allocate(),superclass()的Module,Class是Module的子类.
#所有的类都最终继承于Object,Object继承于BasicObject
以Rake为例:
module Rake
class Task
#...
#使用Rake::Task来拓展命名空间
关于常量:
module MyModule
MyContent = "aaa"
class MyClass
MyContent = "bbb"
end
end
#对于常量MyContent,也可以使用MyModule::MyClass::MyContent这样的格式来引用
Kernel模块
Object引用了Kernel模块,因此Kernel模块中的方法可以对任何对象使用。那么可以用类似打开类的方式给Kernel增加方法(称为“内核方法”)
module Kernel
def my_method
end
end
self
class MyClass
def testing_self
@var = 10
self.my_method()
end
def my_method
@var = @var+1
end
end