Диляна обнови решението на 23.10.2011 21:31 (преди около 13 години)
+class Array
+ def to_hash
+ inject({}) {|hash_result, (key,value)| hash_result[key] = value; hash_result}
+ end
+ def index_by
+ inject({}) {|h, el| h[yield el] = el; h}
+ end
+ def subarray_count(other_array)
+ csubarray = 0
+ subarray_length = other_array.length
+ self_length = self.length;
+ len = self_length - subarray_length
+ if self_length - subarray_length < 0 then
+ return 0
+ end
+ for current_index in 0..len
+ if self.slice(current_index,subarray_length).eql?(other_array) then
+ csubarray += 1
+ end
+ end
+ return csubarray
+ end
+ def occurences_count
+ inject({}) {|hash_result,element| hash_result[element] = self.count(element); hash_result}
+ end
+end
- Оставяй по един празен ред между дефинициите на методи в клас
- По конвенция, едноредовите блокове с къдрави скоби имат интервали около скобите така:
sth { |args| code }
- Излишните неща в Ruby не са на почит; излишно е да се ползва
then
сif
, когато тялото наif
-а е на следващия ред -
for
е зло — ако си била на последните лекции, със сигурност вече знаеш :) Ако не — ползвайEnumerable#each
; ползва се в 95% процента от случаите; в останалите, свързани с енумериране на потоци с неизвестен край (например мрежови потоци), се ползватwhile
/until
/loop
, но не иfor
:) С две думи:for
— никога - Пропускай експлицитния
return
, когато не е нужен; например в края на функцията, за да върнеш стойността на променливатаcsubarray
, напиши простоcsubarray
- И като стана дума, що за име е
csubarray
? :) Нещо по-обикновено би било доста по-добре, напримерsubarray_count
; по-голямата дължина на името не е непременно лошо нещо - Всъщност, каквато и конвенция да избере човек, трябва да я спазва консистентно; няма по-лошо нещо от неконсистентен код; код с лоша конвенция е по-добър отколкото код с никаква; в случая визирам
subarray_length
, което е кръстено добре, но пък не в тон с предишна конвенция; очаквах да видяlsubarray
:)) - Като цяло, струва ми се, че в
subarray_count
има малко излишни променливи и малко излишен код; например, интересно ми е защо правиш променливаlen
и на следващия ред, вif
-а смяташ същия израз отново :)
Ако все още не си, разгледай решенията на колегите си. Може да видиш и примерното решение на Стефан, което не е лошо :))