Йоан обнови решението на 26.10.2014 01:16 (преди около 10 години)
+module OverwriteOperators
+ attr_accessor :second_filter_type
+ attr_accessor :second_filter
+
+ def &(other)
+ puts(other.method(:filter))
+ self.second_filter_type = :and
+ self.second_filter = other
+ self
+ end
+
+ def |(other)
+ self.second_filter_type = :or
+ self.second_filter = other
+ self
+ end
+end
+
+class Filter
+ include OverwriteOperators
+ @block
+
+ def initialize (&block)
+ @block = block if block_given?
+ end
+
+ def filter(number)
+ @block.call(number)
+ end
+end
+
+class TypeFilter
+ include OverwriteOperators
+ @type
+ @number
+
+ def initialize (type)
+ @type = type
+ end
+
+ def filter (number)
+ case number
+ when Integer then @type == :integer
+ when Rational, Float then @type == :real
+ when Complex then @type == :complex
+ end
+ end
+end
+
+class SignFilter
+ include OverwriteOperators
+ @sign
+
+ 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 NumberSet
+ include Enumerable
+
+ def initialize
+ @values = []
+ end
+
+ def << (number)
+ case number
+ when Rational, Float then number = to_integer_from_rational(number)
+ when Complex then number = to_integer_from_complex(number)
+ end
+
+ @values.push(number) unless @values.include? number
+ end
+
+ def to_integer_from_rational(number)
+ integer, float = number.to_i, number.to_f
+ integer == float ? integer : float
+ end
+
+ def to_integer_from_complex(number)
+ Complex(number).abs
+ end
+
+ def size
+ @values.size
+ end
+
+ def empty?
+ @values.empty?
+ end
+
+ def each (&block)
+ @values.each
+ end
+
+ def [](filter)
+ case filter.second_filter_type
+ when :or
+ @values.select{|x| filter.filter(x) || filter.second_filter.filter(x)}
+ when :and
+ @values.select{|x| filter.filter(x) && filter.second_filter.filter(x)}
+ else
+ @values.select{|x| filter.filter(x)}
+ end
+ end
+end
Не виждам нуждата от използване на each(собствено имплементиран).
Здрасти,
Ето няколко коментара по кода:
- Пробвай да изпълниш някой от методите на
Enumerable
, примерноinclude?
върху твояNumberSet
. :) Ще видиш нуждата от коректно имплементиранNumberSet#each
. - С каква цел пишеш
@block
в тялото на класа? - Не оставяй празно място между името на метод и параметрите му при дефиниция.
-
Filter#filter
името не ми харесва. До колкото разбирам метода връща истина/лъжа. Имаме конвенция за подобни методи. - Защо са ти необходими
to_integer_from_...
методите? Според мен не са. - Предпочитай
<<
за добавяне на елемент в масив предpush
. - Не ми харесва как си реализирал
Filter#&
иFilter#|
. Защо не пробваш да ги реализираш връщайки новFilter
обект.Filter#filter
връща булева стойност, така че не би трябвало да имаш проблем да комбинираш резултатите от две извиквания на този метод с правилния логически оператор. Това ще направиNumberSet#[]
метода ти значително по-прост.