あなたはクラスが何であるか、または少なくともそれらをうまく使用する方法について誤解しているようです。
クラスは、アプリケーションの内部ユニバース内の明確な概念またはアイテムを表すオブジェクトのタイプです。
Stack Overflowのようなアプリケーションの内部は、User
,Question
およびAnswer
のオブジェクトで構成されています。したがって、これらはソースコードで見つかるかもしれないクラスの一部です。
このような個人Answer
またはあなたのような個人User
は、クラスのインスタンスです。別のUser
またはAnswer
とは異なる固有のデータがありますが、同じ動作(たとえば、delete
またはedit
)を共有しています。
あなたはPlaylist
というクラスがあります。論理的には、これはSong
のリストでなければなりません。 Song
は別のコンセプトであり、独自のデータと動作を持つため、別のクラスにする必要があります。
Playlist
は現時点では何もしないので、おそらくArray
オブジェクトを使用することをお勧めします。
Playlist = Array
以降:
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
と思われたので、artist
をgets.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.
幸運。