Христо обнови решението на 31.10.2012 15:22 (преди около 12 години)
+#не е като да е.. решение
+class Song
+ attr_accessor :name, :artist, :album
+ def initialize (song_string)
+ song_parts = song_string.split("\n")
+ @name = song_parts[0]
+ @artist = song_parts[1]
+ @album = song_parts[2]
+ end
+end
+
+class Collection
+ include Enumerable
+
+ def each
+ @songs.each do |song|
+ yield song
+ end
+ end
+
+ def initialize(text)
+ @songs = []
+ text.split("\n\n").each do |song|
+ @songs << Song.new(song)
+ end
+ end
+
+ def self.parse(text)
+ self.new text
+ end
+
+ def artists
+ map { |song| song.artist }.uniq
+ end
+
+ def albums
+ map { |song| song.album }.uniq
+ end
+
+ def names
+ map { |song| song.name }.uniq
+ end
+
+#returning Array.. not collection *fix*
+ def filter criterion
+ @songs.select { |i| criterion.match? i }
+ end
+
+#filtered_collection... not an Array
+ def adjoin filtered_collection
+ #concat but for Collection
+ end
+end
+
+class Criteria
+ attr_accessor :name, :artist, :album
+ def self.name text
+ result = Criteria.new
+ result.name = text
+ result
+ end
+
+ def self.artist text
+ result = Criteria.new
+ result.artist = text
+ result
+ end
+
+ def self.album text
+ result = Criteria.new
+ result.album = text
+ result
+ end
+
+ def match? song
+ song.name == @name or song.artist == @artist or song.album == @album
+ end
+
+ def &
+
+ end
+
+ def !
+
+ end
+
+ def |
+
+ end
+end
- Не оставяй интервали между името на метода и скобите около параметрите, напр. на ред 4 трябва да е
def initialize(...)
- Редове 5 до 8 могат да се запишат така:
@name, @artist, @album = song_stirng.split("\n")
-
Collection#each
може да стане като само вземеш блок и го подадеш без промяна на@songs.each
:def each(&block); @songs.each(&block); end
-
Collection#initialize
може да се напише сmap
- В
Collection.parse
,self
вече еCollection
и се подразбира, т.е. се и изпуска; напр.Collection.new
,self.new
иnew
е едно и също в този контекст - Струва ми се, че идентацията ти на места е счупена (напр. в метода
Collection#filter
) -
i
е неподходящо име на променлива на ред 46 - В клас-методите на
Criteria
имаш повторение на код, което вероятно може да се избегне; виждам, че класът ти е in progress, което значи, че може би ще го промениш :)