Ruby如何打印/放置读取的文件内容而不是一堆数字/符号
Posted
技术标签:
【中文标题】Ruby如何打印/放置读取的文件内容而不是一堆数字/符号【英文标题】:Ruby how to print/puts read file contents instead of a bunch of numbers/symbols 【发布时间】:2021-12-06 09:07:26 【问题描述】:在 ruby 中,我创建了一个类和数组,用于从文本文件中读取内容然后输出。
class Album
attr_accessor :artist, :title, :genre, :tracks
end
album = Album.new(album_title, album_artist, album_genre, tracks)
-> tracking 是使用 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>
如何打印文件上的实际文字?
【问题讨论】:
如何打印出曲目?该代码看起来如何?当您希望输出具有特定格式(例如,包含名称和位置)时,您必须告诉 Ruby 所需的格式。您是否声明了自定义to_s
或 inspect
方法?
【参考方案1】:
您得到的回报是 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]
【讨论】:
tracks.map |track| [track.name, track.location] 有我想要的效果谢谢。虽然我也发现我可以用“puts track.name”“puts track.location”调用一个过程,并根据数组的长度循环它。【参考方案2】:您正在观察Object#to_s
和Object#inspect
中定义的默认行为。
Ruby 使用to_s
方法将对象转换为字符串,并使用inspect
方法获取适合调试的对象的字符串表示形式。默认情况下,to_s
和 inspect
或多或少是一回事。唯一的区别是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>
【讨论】:
以上是关于Ruby如何打印/放置读取的文件内容而不是一堆数字/符号的主要内容,如果未能解决你的问题,请参考以下文章