tips1 打开类的使用
class TestReplace
def to_replace(s)
s.gsub /[^\w\s]/, ''
end
end
'2 the Magic Num'==TestReplace.new.to_replace('#2, the Magic, Num') #=>true
上面用法是我们常用的方法,如何使用ruby的打开类定义呢
class String
def to_replace
s.gsub /[^\w\s]/, ''
end
end
'2 the Magic Num'=='#2, the Magic, Num'.to_replace #=>true
打开类较之前的方法相比,更加灵活,并且无需定义新类。同样的我们可以在ruby的基础类Numeric, Array中定义方法。当然要注意的是不能与原有的基础类重名。如下面定义的类的方法就会出错。
class Array
def replace(from, to)
each_with_index do |e, i|
self[i] = to if e ==from
end
end
如何查看Array中的方法呢,命令如下[].methods.grep /^re/ #=>[;replace, :reject, :reject! ...]
可以看到Array中已经定义好了replace方法。
tips2 对象, 类的关系和定义
class Myclass
def my_method
@v=1
end
end
obj1=Myclass.new
obj2=Myclass.new
对象就是一组实例变量和一个指向其类的引用。类是一个对象(Class类的一个实例)和一组实例方法和一个对超类的引用。
tips3 类命名冲突解决方法
如果之前定义过类class Text,现在由于某种需求还有定义一个class Text,解决方法如下
module Book
class Text
......
调用Book::Text
tips4 module和class的区别和联系
一个module(模块)基本上是一组实例方法,而类是一个增加了superclass() new()等方法的模块。如何选择使用它们呢。如果希望它在别处被包含(include)或者当成命名空间,应选择模块,如果希望它被继承或者实例化,选择类。
tips5 include module方法引用顺序
module Printable
def print
p "printable"
end
end
module Document
def print
p "document"
end
end
class Book
inlcude Document
include Printable
end
b=Book.new
b.print #=>"printable"
结果调用的是Printable中的print方法
如果将class Book改成如下
class Book
include Printable
inlcude Document
end
b=Book.new
b.print #=> "document"
结果调用的Document中的print方法。