Димо обнови решението на 21.10.2011 19:01 (преди около 13 години)
+class Array
+ def to_hash()
+ result={}
+ self.each {|n| result[n[0]] = n[1]}
+ result
+ end
+
+ def index_by(&block)
+ result={}
+ self.each {|n| result[block[n]] = n}
+ result
+ end
+
+ def subarray_count(sub)
+ if(self.count < sub.count)
+ 0
+ else
+ result = 0
+ while !self.empty?
+ if self.last(sub.count) == sub
+ result += 1
+ end
+ self.pop
+ end
+ result
+ end
+ end
+
+ def occurences_count()
+ result=Hash.new(0)
+ self.each {|n| result[n]=self.count(n)}
+ result
+ end
+end
- Whitespace-а ти не е ОК. В Ruby се слагат интервали около знака за присвояване. Например,
result = {}
иresult = Hash.new(0)
. - Няма нужда от скобите на
if
-а вsubarray_count
. - Вместо да подаваш блок експлицитно в
index_by
, по-добре просто да правишyield(n)
. -
self.
е излишен на всички места. - В
subarray_count
идентацията ти е лоша.0
трябва да е два интервала по-навътре. -
while !self.empty?
се записва като.until empty?
. Допълнително,subarray_count
е много лошо написан, понеже изпразва масива, на който е извикан. Това би било доста изненадващо. Ако бях видял това преди да пусна тестовете, щях да добавя няколко, които да проверяват това. - За кратки условия, този стил е за предпочитане:
result += 1 if last(sub.count) == sub
- В твоя израз
if self.last(sub.count) == sub
има два интервала отдясно на==
. - Скобите при дефиниране методи без параметри се изпускат. Демек,
def to_hash
иdef occurences_count
.