假如你没有厌烦,那么你激动的时候到了,上面我们从来没有完整的写过一个复杂的程序,因为我们了解的还不够,接下来,兴奋的东西开始了,拭目以待!
1.类的建立:
class Song
def initialize(name, artist, duration)
@name=name
@artist=artist
@duration = duration
end
end
1)类的建立使用关键字 class
2)initialize是一个特殊的method,在使用new创建对象的时候,Ruby先分配内存给object,就是为所有的instance variables分配空间,再调用initialize method,初始化object
3)所有的instance variables都可以被类里面的所有方法访问
我们看看上面那个类的使用
song = Song.new("Bicylops", "Fleck", 260)
song.inspect→#<Song:0x1c7ca8 @name="Bicylops", @duration=260,@artist="Fleck">
inspect是一个message,我们前面提过这个概念,相对的我们说这个object是一个receiver,inspect这个message是每个receiver都可以使用的,通俗的说,所有的object都可以使用inspect,inspect显示了object’s ID和所有的instance variables
另外有一个更加常用的message---to_s,这里使用:
song = Song.new("Bicylops", "Fleck", 260)
song.to_s→"#<Song:0x1c7ec4>" #显示object's id
override to_s可以帮助我们使用更好的方式来显示一个类
ruby的类永远不是closed,也就是说,你任何时候你都可以向已有的类里面添加方法,这是一个让人惊讶的ruby way!假如在c++,java里面,我们要添加一个method,该怎么做?必须继承它,然后添加,因为java和c++认为,你添加新方法以后,你就不是这个类了,而我们知道,事物是相对的,比如说,car,在我们看来car,需要对它的外观审视,使用性能做检查等等,在制造商哪里,却包含一些我们并不熟悉的行为,比如检查发动机的情况,测试汽车撞击损坏程度。当然我们可以硬说这些car不是同个类别(实际上是car类),其实,我想这只是我们使用事物的方式不同而已。现在ruby为我们提供了一种方式,可以方便的修改,也就是说,如果我是厂商,我的car要加入检查发动机这个行为,我就加入就可以了,不需要继承,当然这不是说ruby就不用继承了,继承非常重要,因为继承所有的类才会有to_s方法。添加方法这样的方式是否会带来副作用,可能还需要时间去考证吧。
注意,我们一直说的是添加方法,其实我们通过添加方法,可以实现添加属性(不推荐使用,后面会提到)
那么如何添加一个方法到一个类里面去?很简单:再写一次定义。例如:
class Song
def initialize(a,b,c)
@a=a
@b=b
@c=c
end
end
song = Song.new("Bicylops","Fleck",260)
#add a method to Song
class Song
def to_s
"#@a,#@b,#@c"
end
end
song2 = Song.new("Bicylops","Fleck",260)
print song2.to_s,"\n" # 使用添加的方法
print song.to_s # 即使以前创建的类,也可以使用新添加的方法
结果是:
Bicylops,Fleck,260
Bicylops,Fleck,260