2017-03-19 22 views
0

私は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 

は、...ちょうどそのように、ユーザーの最後にこの作業を行う方法についていくつかのヒントが欲しいです曲を入力すると、すべての曲の結果が印刷されます!ありがとう!

答えて

2

あなたはクラスが何であるか、または少なくともそれらをうまく使用する方法について誤解しているようです。

クラスは、アプリケーションの内部ユニバース内の明確な概念またはアイテムを表すオブジェクトのタイプです。

Stack Overflowのようなアプリケーションの内部は、User,QuestionおよびAnswerのオブジェクトで構成されています。したがって、これらはソースコードで見つかるかもしれないクラスの一部です。

このような個人Answerまたはあなたのような個人Userは、クラスのインスタンスです。別のUserまたはAnswerとは異なる固有のデータがありますが、同じ動作(たとえば、deleteまたはedit)を共有しています。

あなたはPlaylistというクラスがあります。論理的には、これはSongのリストでなければなりません。 Songは別のコンセプトであり、独自のデータと動作を持つため、別のクラスにする必要があります。

Playlistは現時点では何もしないので、おそらくArrayオブジェクトを使用することをお勧めします。

Playlist = Array 

以降:

  • name
  • class Playlist 
        # extra behaviour when needed 
    end 
    

    Songは、3つのデータを持っているあなたは、将来的にこれを変更することができるように、あなたはこのような何かを行うことができます

  • genre
  • artist

Rubyでは、私たちは、セッターとゲッターを処理するためにattr_accessorを使用することができます。

class Song 
    attr_accessor :name, :genre, :artist 
end 

クラスと変数名で大文字と小文字が区別されることに注意してください。あなたはp = playlist.newと間違えました。

完全に適合したコードです。私は可読性を向上させるためにいくつかの変数名を変更しました。

forループをRubyの.timesメソッドに変更しましたが、これは読みやすいと思います。

最後に、私はStringと思われたので、artistgets.chompに変更しました。私がこれについて間違っていたならば、それを元に戻してください。

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を使用することができます。 attr_accessorはこれを暗黙的に行います。

class Duck 
    attr_accessor :name 

    def quack 
    "QUACK! My name is #{name}." 
    end 
end 

a_duck = Duck.new 
a_duck.name = "Mr. Duck" 
puts a_duck.quack 
#=> QUACK! My name is Mr. Duck. 

幸運。

関連する問題