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_nametrack_location包含一个轨道的值。我不确定你想要什么样的格式 return,但这是一种相当简单但灵活的格式。最简单的方法是数组数组,你可以使用:

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

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

Ruby 使用 to_s 方法将对象转换为字符串,使用 inspect 方法获取适合调试的对象的字符串表示形式。默认情况下,to_sinspect 或多或少是一回事。唯一的区别是 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>