Ruby 如何 print/puts 读取文件内容而不是一堆 numbers/symbols
Ruby how to print/puts read file contents instead of a bunch of numbers/symbols
在 ruby 中,我创建了一个 class 和数组,用于从文本文件中读取内容然后输出它们。
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>
如何打印出文件中的实际文字?
您在 return 中得到的是您的曲目 class 的实例。这些实例中的每一个都可以访问 attr_accessor 中 class 定义中指定的名称和位置等属性。您可以更改最后一条语句 (return tracks
)(请注意这里不需要 return
,因为它是方法中的最后一条语句,最后一件事将默认 returned ruby).
试试这个而不是 return tracks
tracks.map{ |track| {track_name: track.name, track_location: track.location} }
这是你最终得到的散列数组,每个散列键为 track_name 和 track_location包含一个轨道的值。我不确定你想要什么样的格式 return,但这是一种相当简单但灵活的格式。最简单的方法是数组数组,你可以使用:
racks.map{ |track| [track.name, track.location] }
您正在观察 Object#to_s
and Object#inspect
中定义的默认行为。
Ruby 使用 to_s
方法将对象转换为字符串,使用 inspect
方法获取适合调试的对象的字符串表示形式。默认情况下,to_s
和 inspect
或多或少是一回事。唯一的区别是 inspect
也会显示实例变量。
您可以而且应该在 Track
class 中覆盖这些方法。例如:
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 中,我创建了一个 class 和数组,用于从文本文件中读取内容然后输出它们。
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>
如何打印出文件中的实际文字?
您在 return 中得到的是您的曲目 class 的实例。这些实例中的每一个都可以访问 attr_accessor 中 class 定义中指定的名称和位置等属性。您可以更改最后一条语句 (return tracks
)(请注意这里不需要 return
,因为它是方法中的最后一条语句,最后一件事将默认 returned ruby).
试试这个而不是 return tracks
tracks.map{ |track| {track_name: track.name, track_location: track.location} }
这是你最终得到的散列数组,每个散列键为 track_name 和 track_location包含一个轨道的值。我不确定你想要什么样的格式 return,但这是一种相当简单但灵活的格式。最简单的方法是数组数组,你可以使用:
racks.map{ |track| [track.name, track.location] }
您正在观察 Object#to_s
and Object#inspect
中定义的默认行为。
Ruby 使用 to_s
方法将对象转换为字符串,使用 inspect
方法获取适合调试的对象的字符串表示形式。默认情况下,to_s
和 inspect
或多或少是一回事。唯一的区别是 inspect
也会显示实例变量。
您可以而且应该在 Track
class 中覆盖这些方法。例如:
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>