En ruby, he creado una clase y una matriz, para leer los contenidos de un archivo de texto y luego generarlos.
class Album attr_accessor :artist, :title, :genre, :tracks end album = Album.new(album_title, album_artist, album_genre, tracks)-> las pistas son una matriz de varias líneas que se leen del archivo de texto mediante un bucle while. Contexto a continuación, 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 after album = Album.new(album_title, album_artist, album_genre, tracks) , pasé el álbum a un procedimiento diferente print_tracks(album) , y en print_tracks(album) , puse puts album.tracks .
Pero en lugar de imprimir varias líneas de nombres de pistas y ubicaciones de pistas, obtengo algo parecido a esto:
#<Track:0x000055c028027b08> #<Track:0x000055c0280277c0> #<Track:0x000055c028027630>¿Cómo imprimo las palabras reales en el archivo?
Lo que obtiene a cambio son instancias de su clase Track. Cada una de esas instancias tiene acceso a atributos como nombre y ubicación como se especifica en la definición de clase en attr_accessor. Puede cambiar su última declaración ( return tracks ) (tenga en cuenta que no es necesario return aquí ya que es la última declaración en el método, lo último se devolverá de forma predeterminada en Ruby).
Prueba esto en lugar de return tracks
tracks.map{ |track| {track_name: track.name, track_location: track.location} }De esta manera, terminará con una matriz de hashes con claves de track_name y track_location, cada una de las cuales contiene un valor de una pista. No estoy seguro de qué tipo de formato desea devolver, pero este es bastante simple, pero flexible. La forma más simple sería matriz de matriz, que puede obtener usando:
racks.map{ |track| [track.name, track.location] }Está observando el comportamiento predeterminado definido en Object#to_s y Object#inspect .
Ruby usa el método to_s para convertir objetos en cadenas y el método inspect para obtener representaciones de cadenas de objetos adecuados para la depuración. Por defecto, to_s e inspect son más o menos lo mismo. La única diferencia es que la inspect también mostrará las variables de instancia.
Puede y debe anular estos métodos en su clase Track . Por ejemplo:
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>