PR2是以一个卡拉OK点唱机为例子介绍Ruby编程的。新建一个songdata的文档,里面写入几个song的数据,然后从文件里读出数据并赋值给一个song对象然后打印出来。songdata文件中的内容如下:
/jazz/j00132.mp3 |3:45| fats Waller|Ain't Misbehavin'
/jazz/j00319.mp3 |2:58| Louis Armstring | Wonderful World
/bgrass/bg0732.mp3 |Strength in Numbers | Texas Red
程序相应内容如下:
require "Song_List"
require "song"
song_file=File.open("songdata.txt")
songs = SongList.new
song_file.each do |line|
fiel, length, name, title = line.chomp.split(/\s*\|\s*/)
songs.append(Song.new(title,name,length))
end
puts songs[1].to_s
puts songs[1].inspect
输出结果如下:
name is Wonderful World, artist is Louis Armstring, duration is 2:58
#<Song:0x2a37e18 @duration="2:58", @name="Wonderful World", @artist="Louis Armst
ring">
1 其中因为用到了别的类,所以要用require引用一下,注意,引用的是文件名Song_List而不是类名songlist
2 song.rb中的to_s的方法定义如下:
def to_s
" name is #@name, artist is #@artist, duration is #@duration"
end
其中类中要有定义属性:attr_reader :name, :artist,:duration
3 其中inspect方法适用于任何对象,用来打印出类的ID和类中的属性及其它东西
4 在打开文件时,原文件也用到了迭代:
File.open("songdata.txt") do |song_file|
songs = SongList.new
song_file.each do |line|
fiel, length, name, title = line.chomp.split(/\s*\|\s*/)
songs.append(Song.new(title,name,length))
end
#puts songs[1].to_s
puts songs[1].inspect
end
但只打开了一个文件,觉得可以不用迭代,则用上面最初的代码替换了一下,最后是可以的。即song_file=File.open("songdata.txt")
5 第一个任务是要把每行分成各个字段, String#split
方法最适合最这个。在这里,我们给 split 传递一个正则表达式,/\s*|\s*/,它会用小竖线和空格来分隔一行文本,把文本分成各个字段。还有,因为因为用文件里读取的这行文本后面跟了一个换行符,在我们用split函数之前,我们可以使用String#chomp
来把换行符去掉
6 name.squeeze!(" ") 掉那些额外的空格,使用这个方法的 squeeze! 格式,它会改变适当位置的字符串
评论