Светослав обнови решението на 25.10.2014 18:06 (преди около 10 години)
+module Operators
+ def &(filter)
+ FilterIntersection.new self, filter
+ end
+
+ def |(filter)
+ FilterUnion.new self, filter
+ end
+end
+
+class NumberSet
+ include Enumerable
+
+ def initialize()
+ @numbers = []
+ end
+
+ def <<(number)
+ @numbers << number unless @numbers.include? number
+ end
+
+ def size
+ @numbers.size
+ end
+
+ def empty?
+ @numbers.empty?
+ end
+
+ def each
+ @numbers.each { |e| yield(e) }
+ end
+
+ def [](filter)
+ @numbers.select { |e| filter.filter(e) }
+ end
+end
+
+class Filter
+ include Operators
+
+ def initialize(&block)
+ @block = block
+ end
+
+ def filter(number)
+ @block.(number)
+ end
+end
+
+class TypeFilter
+ include Operators
+
+ def initialize(type)
+ @type = type
+ end
+
+ def filter(number)
+ case @type
+ when :integer then number.is_a? Integer
+ when :real then number.is_a? Float or number.is_a? Rational
+ when :complex then number.is_a? Complex
+ end
+ end
+end
+
+class SignFilter
+ include Operators
+
+ def initialize(sign)
+ @sign = sign
+ end
+
+ def filter(number)
+ case @sign
+ when :positive then number > 0
+ when :non_positive then number <= 0
+ when :negative then number < 0
+ when :non_negative then number >= 0
+ end
+ end
+end
+
+class FilterIntersection
+ include Operators
+
+ def initialize(first_filter, second_filter)
+ @first_filter = first_filter
+ @second_filter = second_filter
+ end
+
+ def filter(number)
+ @second_filter.filter(number) and @first_filter.filter(number)
+ end
+end
+
+class FilterUnion
+ include Operators
+
+ def initialize(first_filter, second_filter)
+ @first_filter = first_filter
+ @second_filter = second_filter
+ end
+
+ def filter(number)
+ @second_filter.filter(number) or @first_filter.filter(number)
+ end
+end
Здрасти,
Хубаво решение. Ето няколко препоръки:
- Защо избра да ползваш mixin? Не можеше ли да минеш без
Operators
и да оставишTypeFilter
,SignFIlter
, ... да наследятFilter
, където да имплементираш двата метода? - Не слагай скоби при дефиниране на метод, ако той няма параметри.
- Мисля си, че в
NumberSet#[]
връщашArray
обект, а ние очаквамеNumberSet
обратно. Кода в метода ти не е идентиран правилно. - Провери как работи
Array#each
, когато не му подадеш блок. ОчаквамеNumberSet#each
да се държи по същия начин. - Аз бих подравнил
then
-овете в дватаcase
-а. Ще стане много красиво, обещавам. :))