Ruby如何打印/放置读取文件内容而不是一堆数字/符号



在ruby中,我创建了一个类和数组,从文本文件中读取内容,然后输出它们。

class Album
attr_accessor :artist, :title, :genre, :tracks
end
album = Album.new(album_title, album_artist, album_genre, tracks) 

→Tracks是使用while循环从文本文件读取的多行数组。下面的上下文,a_file/music_file File.new("album.txt", "r")

class Track
attr_accessor :name, :location
def read_track(a_file)
track_title = a_file.gets()
track_location = a_file.gets()
track = Track.new(track_title, track_location)
end
def read_tracks(music_file)
tracks = Array.new()
count = music_file.gets().to_i()
track = music_file
index = 0
while (index < count)
track = read_track(music_file)
tracks << track
index += 1
end
return tracks
end
end

album = Album.new(album_title, album_artist, album_genre, tracks)之后,我将相册传递给另一个程序print_tracks(album),在print_tracks(album)中,我有puts album.tracks

但是,我没有打印出几行轨道名称和轨道位置,而是得到如下所示的内容:

#<Track:0x000055c028027b08>
#<Track:0x000055c0280277c0>
#<Track:0x000055c028027630>

如何打印文件上的实际单词?

您得到的是Track类的实例。每个实例都可以访问attr_accessor中类定义下指定的名称和位置等属性。您可以更改最后一条语句(return tracks)(请注意,这里不需要return,因为它是方法中的最后一条语句,默认情况下,ruby将返回最后一个内容)。

试试这个代替return tracks

tracks.map{ |track| {track_name: track.name, track_location: track.location} }

你会得到一个键值为track_name的哈希数组和track_location每个包含一个轨道的值。我不确定您想要返回哪种格式,但这是一种相当简单但灵活的格式。最简单的方法是数组的数组,您可以使用:

racks.map{ |track| [track.name, track.location] }

您正在观察Object#to_sObject#inspect中定义的默认行为。

Ruby使用to_s方法将对象转换为字符串,使用inspect方法获得适合调试的对象的字符串表示。默认情况下,to_sinspect大致相同。唯一的区别是inspect也会显示实例变量。

你可以并且应该在你的Track类中重写这些方法。例如:

class Track
def to_s
"#{self.class.name} #{name} @ {location}"
end
def inspect
"#<#{to_s}>"
end
end
track.to_s
puts track
# Track: name @ /music/name.flac
track.inspect
p track
# #<Track: name @ /music/name.flac>

最新更新