ruby中类的写法以及属性,实例变量,类方法的用法
本文章已收录于:
分类:
作者同类文章
X
版权声明:本文为博主原创文章,未经博主允许不得转载。
- 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中类的写法
定义一个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
可以添加类方法对类进行扩展功能