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_sinspect 方法? 【参考方案1】:

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

试试这个而不是return tracks

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

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

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

【讨论】:

tracks.map |track| [track.name, track.location] 有我想要的效果谢谢。虽然我也发现我可以用“puts track.name”“puts track.location”调用一个过程,并根据数组的长度循环它。【参考方案2】:

您正在观察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>

【讨论】:

以上是关于Ruby如何打印/放置读取的文件内容而不是一堆数字/符号的主要内容,如果未能解决你的问题,请参考以下文章

从文件内容中读取和执行操作

我如何显示一个字节的位长,而不是整数

ruby读取csv行数

如何在 ruby​​ 中读取没有 quote_char 的 CSV?

尝试打印正确数量的'*'代替数值

PHP读取文件注释而不是文件内容 - 忘记了