2017-03-19 2 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

수업 내용에 대한 오해가 있거나 수업을 잘 사용하는 것처럼 보입니다.

클래스는 응용 프로그램의 내부 영역에서 고유 한 개념이나 항목을 나타내는 개체 유형입니다.

스택 오버플로와 같은 응용 프로그램의 내부는 User, QuestionAnswer 개의 개체로 구성됩니다. 따라서 이들은 소스 코드에서 찾을 수있는 클래스 중 일부입니다.

개인이 Answer이거나 개인이 같은 사람 User은 클래스의 인스턴스입니다. 자체의 고유 한 데이터가 있으며 다른 데이터는 User 또는 Answer이지만 동일한 동작 (예 : delete 또는 edit)을 공유합니다.

Playlist 클래스가 있습니다. 논리적으로 이것은 Song의 목록이어야합니다. Song은 별도의 개념으로 자체 데이터 및 동작이 있으므로 별도의 클래스 여야합니다.

Playlist은 현재 아무 것도하지 않으므로 Array 개체를 사용하는 것이 가장 좋습니다. 나중에이를 변경할 수 있도록, 당신은 같은 것을 할 수 있습니다 나중에

Playlist = Array 

과 :

class Playlist 
    # extra behaviour when needed 
end 

Song 데이터의 세 가지가 있습니다

  • name
  • genre
  • artist

Ruby에서 우리는 attr_accessor을 사용하여 setter와 getter를 처리 할 수 ​​있습니다.

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

클래스 및 변수 이름에 대소 문자가 구분됩니다. 그 실수는 p = playlist.new입니다.

다음은 완전히 수정 된 코드 버전입니다. 가독성을 높이기 위해 일부 변수 이름을 변경했습니다.

또한 for 루프를 Ruby의 .times 메서드로 변경했습니다.이 메서드는 읽기가 쉽습니다.

마지막으로 을 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를 사용할 수 있습니다. 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. 

행운을 빕니다.

관련 문제