Камен обнови решението на 21.10.2014 23:55 (преди около 10 години)
Идеално! Много ми харесва решението.
Имам два много дребни коментара:
- Не слагай празен ред преди първия метод дефиниран в клас.
- Когато дефинираш оператор кръщавай параметъра
other
. Примерноdef &(other)
. Дребно нещо, което помага за подобряване на консистентността.
Няколко неща, които аз бих направил, но не смятам за абсолютно правилни/фатални:
- Бих наименовал метода
Filter#satisfies?
/Filter#matches?
или нещо подобно вместоFilter#call
. Това мисля, че ще ми направи кода една идея по-четим. Така в метода&
ще имам нещо от сорта наFilter.new { |x| self.satisfies? x and other.satisfies? x }
- Бих подравнил
then
клаузите вcase
за да се изравнятsuper
извикванията. В случая са доста подобни и мисля, че ще изглежда прилично.
Anyways, според мен решението ти заслужава бонус точки.
Edit
Пропуснах да спомена, че NumberSet#[]
трябва да връща NumberSet
обект :)
И още една дреболия: скобите след super
са излишни. Това е достатъчно: super { |x| ... }
Първоначалното решение което се опитах да направя наследяваше Array и Proc, но по някаква причина не успях да override-на initialize
метода. До колкото разбрах не е добра практика да се наследяват core обекти защото може да се държат по-странно от нормални ruby обекти, което мисля усетих с Proc. Та от там остана и call
метода. Ще пусна поправено решение малко по-късно днес. И за NumberSet#[]
също.
@mitio Ако не сложиш скоби след super
се препредават параметрите от горния метод. Това било един от малкото случаи в ruby в които скобите имат значение.