根据用户输入创建类

时间:2017-03-19 19:37:15

标签: ruby

我是Ruby的新手,在写一个要求用户创建自己喜欢的歌曲的播放列表的程序时遇到了一个简单的问题!

class Playlist

array_songs = Array.new
print "How many songs do you want to add to your playlist? "
songs = gets.to_i

for i in 1..songs
    print "Enter song #{i}: "
    song = gets.chomp

    print "Enter genre for song #{i}: "
    genre = gets.chomp

    print "Enter artist of song #{i}: "
    artist = gets.to_i

    p = playlist.new
    p.set_song(song)
    p.set_genre(genre)
    p.set_artist(artist)
    array_songs << p
end
end 

puts "This is your current playlist: "

for song in array_songs
    puts "#{song.get_song} #{song.get_genre} #{song.get_artist}" 
end

所以基本上每次我运行它,它都不会工作,说我有未定义的方法等等......只是想要一些关于如何使这项工作的提示,以便在用户输入结束时歌曲,所有歌曲的结果将被打印!谢谢!

1 个答案:

答案 0 :(得分:2)

你似乎对一个类是什么有误解,或者至少对如何使用它们有误解。

类是一种对象,它表示应用程序内部Universe中的不同概念或项。

Stack Overflow等应用程序的内部Universe由({1}},UserQuestion个对象组成。因此,这些是您可能在源代码中找到的一些类。

与此类似的个人Answer或与您一样的个人Answer是该类的实例。它有自己独特的数据,与另一个UserUser的数据不同,但它共享相同的行为,例如Answerdelete

您有一个名为edit的班级。从逻辑上讲,这应该是Playlist的列表。由于Song是一个单独的概念,具有自己的数据和行为,因此它应该是一个单独的类。

因为Song目前没有做任何事情,所以最好使用Playlist对象。为了以后你可以改变它,你可以这样做:

Array

后来:

Playlist = Array

class Playlist # extra behaviour when needed end 有三个数据:

  • Song
  • name
  • genre

在Ruby中,我们可以使用artist来处理setter和getter。

attr_accessor

注意类和变量名称的区分大小写。你用class Song attr_accessor :name, :genre, :artist end 犯了错误。

这是完全适应的代码版本。我更改了一些变量名以提高可读性。

我还将您的p = playlist.new循环更改为Ruby的for方法,我认为这种方法更容易阅读。

最后,我已将.times的{​​{1}}更改为gets.to_i,因为我认为它应该像其他人一样artist。如果我错了,请改回来。

gets.chomp

最后,我知道这不适用于您的情况,但我觉得如果您还不知道这一点很重要:您可以使用String向类添加行为。 Playlist = Array class Song attr_accessor :name, :genre, :artist end songs = Playlist.new print "How many songs do you want to add to your playlist? " number_of_songs = gets.to_i number_of_songs.times do |i| song_number = i + 1 print "Enter song #{song_number}: " name = gets.chomp print "Enter genre for song #{song_number}: " genre = gets.chomp print "Enter artist of song #{song_number}: " artist = gets.chomp s = Song.new s.name = name s.genre = genre s.artist = artist songs << s end puts "This is your current playlist: " songs.each do |song| puts "#{song.name} #{song.genre} #{song.artist}" end 隐含地执行此操作。

def
祝你好运。