Ruby中类的写法
定义一个class
class Song
def initialize(name,artist,duration)
@name = name
@artist = artist
@duration = duration
end
end
定义了一个歌曲Song类,类名首字母要大写,@开头为实例变量
initialize相当于java中的构造函数,在创建对象的时候会调用此函数,传入参数
song = Song.new("往前一步","孟非",240)
song.inspect 默认将对象的id和实例变量格式化
inspect输出地格式不合适,ruby中可以给类重写to_s方法(有点像java中的toString())
class Song
def to_s
"Song:#@name--#@artist(#@duration)"
end
song.to_s就可以输出定义好的格式
(2)类的继承
现在需要给歌曲添加歌词
class KoraokeSong < Song
def initialize(name,artist,duration,lyrics)
super(name,artist,duration)
@lyrics = lyrics
end
end
67页
(3)对象和属性
一个类的完整写法:
class Song
def initialize(name,artist,duration)#构造器
@name = name
@artist = artist
@duration = duration
end
#读写属性,相当于java中的getter,setter
attr_reader :name,:artist,:duration
attr_writer :name,:artist,:duration
#getter/setter的另外一种写法
#def name
# @name
#end
#def artist
# @artist
#end
#def duration
# @duration
#end
#setter
#def name=(new_name)
# @name = new_name
#end
#...
end
好一个完整的类就写好了。。。
这样new一个对象 song = Song.new("The Mass","abc",260)
song.name #访问属性,getter()
song.name = "My Love" #修改属性值,setter()
(4)ruby中的虚拟属性
现在我们要将秒为单位的时间,换成分钟
def duration_in_minutes
@duration/60.0
end
def duration_in_minutest=(new_duration)
@duration = (new_duration*60).to_i
end
song = Song.new("a","b",260);
song.duration_in_minutes --> 4.333
song.duration_in_minutes = 4.2
song.duration --> 252
duration_in_minutes并不是实例变量
对外界而言,她和其他属性是一样,
在内并没有对应的实例变量。
(5)熟悉几个概念
属性、实例变量和方法
song.name #返回实例变量的值
song.duration_in_minutes #返回计算后的结果
song.duration_in_minutes = 3.8
#等号结尾的方法
(6)类变量
@@play
class Song
@@play=0
def initialize(name,artist,duration)
@name = name
@artist = artist
@duration = duration
@play = 0
end
def play
@play = @play + 1
@@play =@@play + 1
"this song #@play plays. Total #@@play palys."
#xx 播放xx次,总共播放xx次。
end
end
类变量是属于类的。
实例变量是属于每一个对象的。
(java中有静态变量,静态方法,静态类都是属于类的,通过类名直接调用)
(实例变量有点像一般的java中的一般变量)
(7)类方法
有点象java中的静态方法,类名直接调用
当我们的歌曲时间太长了,可以给类定义一个方法
class SongList
MAX_TIME = 5*60
def SongList.is_too_long(song)
return song.duration > MAX_TIME
end
end
我们会发现类方法遍布于ruby库中,例如
File类的对象用来表示在底层文件系统中打开的一个文件。File类提供了几个类方法来操作文件,而他们并未打开文件,因此也没有相应的File对象,如果你想要删除一个文件,你可以调用类方法File.delete,传入文件名作为参数。
File.delete("test.txt")
(8)单例和其他的构造函数
需求:记录点唱机发生的所有事情:
播放的歌曲,收到的点歌费,
倾倒进去的各种奇怪液体等等
因为我们期望为音乐保留网络宽带,
因此我们将日志文件保存在本地。
日志类,但是只有一个,单例模式
class MyLogger
private_class_method :new
@@logger = nil
def MyLogger.create
@@logger = new unless @@logger
@@logger
end
返回的对象都是一个,可以通过查看方法的返回对象的标识来检验
MyLogger.create.object_id --> 24031056
end
可以添加类方法对类进行扩展功能
ruby中类的写法以及属性,实例变量,类方法的用法
最新推荐文章于 2019-07-04 10:39:17 发布