Ruby中如何打印从文件读取的Track对象实际内容而非对象引用
解决Ruby中打印Track对象显示引用而非实际内容的问题
嘿,这个问题我太熟悉了!你看到的那些#<Track:0x000055c028027b08>字符串,其实是Ruby对象的默认输出——它只会告诉你这是个Track类的对象,以及它在内存中的地址,不会自动展示你存在name和location里的实际内容。要搞定这个,有两个简单直接的方案:
方案1:给Track类重写to_s方法
Ruby在调用puts输出对象时,会自动调用对象的to_s方法。默认的to_s就是输出那个“类+内存地址”的字符串,我们只需要重写这个方法,让它返回我们想要的内容就行:
class Track attr_accessor :name, :location # 重写to_s,自定义对象的字符串表现 def to_s # 用strip去掉换行符,避免输出多余空行 "曲目名称: #{@name&.strip} | 文件路径: #{@location&.strip}" end # 修正初始化逻辑:原来的Track没有带参数的初始化方法,直接new会报错 def initialize(name = nil, location = nil) @name = name @location = location end def read_track(a_file) track_title = a_file.gets() track_location = a_file.gets() Track.new(track_title, track_location) end # 你的read_tracks方法保持不变... end
这样当你再执行puts album.tracks时,Ruby会自动把每个Track对象转换成你定义的字符串格式,直接输出曲目名称和路径啦!
方案2:在print_tracks方法中手动遍历并打印属性
如果你不想修改Track类的结构,也可以在打印方法里主动访问每个Track对象的属性,逐个输出:
def print_tracks(album) puts "=== 专辑曲目列表 ===" album.tracks.each_with_index do |track, index| puts "#{index + 1}. 曲目名称: #{track.name&.strip}" puts " 文件路径: #{track.location&.strip}" puts "---------------------" end end
这个方法更灵活,你可以完全自定义输出的排版样式,比如加上序号、分隔线之类的,让输出更美观。
额外提示:修正代码里的小问题
顺便提一下你代码里的两个小bug,不然可能会影响功能:
a_file/music_file = File.new("album.txt", "r")这行是语法错误,应该改成music_file = File.new("album.txt", "r")- 原来的
read_track方法中,Track类没有定义带参数的initialize方法,直接调用Track.new(track_title, track_location)会报错,上面的方案1已经帮你补上了这个初始化方法,记得加上哦!
内容的提问来源于stack exchange,提问作者Theo1290
相关产品推荐
相关产品推荐

