Здравко обнови решението на 26.10.2014 14:36 (преди около 11 години)
+class NumberSet
+  include Enumerable
+
+  def initialize()
+    @container = []
+    @complex_container = []
+  end
+
+  def <<(value)
+    if ! @complex_container.include? value.to_c
+      @container.push value
+      @complex_container.push value.to_c
+    end
+  end
+
+  def size
+    @container.count
+  end
+
+  def empty?
+    @container.empty?
+  end
+
+  def each(&block)
+    @container.each &block
+  end
+
+  def [](current_filter)
+    current_filter.filter(@container)
+  end
+end
+
+class Filter
+  attr_accessor :condition
+
+  def initialize(&block)
+    @condition = block
+  end
+
+  def filter(container)
+    container.select &condition
+  end
+end
+
+class TypeFilter
+  attr_accessor :type
+  attr_accessor :types
+
+  def initialize(type)
+    @type = type
+    @types = { :integer => Fixnum,
+     :real => [Rational, Float], :complex => Complex }
+  end
+
+  def filter(container)
+    container.select { |n| n.instance_of? @types[@type] }
+  end
+end
+
+class SignFilter
+  attr_accessor :sign
+  attr_accessor :signs
+
+  def initialize(sign)
+    @sign = sign
+
+    @signs = { :positive => ">", :non_positive => "<=",
+     :negative => "<", :non_negative => ">=" }
+  end
+
+  def filter(container)
+    container.select {|n| n.send @signs[@sign], 0}
+  end
+end
- Не виждам каква беше целта на 
@complex_container. Ако погледнеш как работятArray#include?и==за числа, ще разбереш, че правиш нещата доста по-complex, отколкото е нужно да са. (: - Правиш черни 
sendмагии вSignFilter. Проблемът е достатъчно прост, за да няма нужда от метапрограмиране. - Всички 
attr_accessor-и нямаше причина да съществуват. С тях нарушаваш Law of Dementer, който е един от градивните принципи за добър ООП дизайн. Опитвай се да криеш имплементацията за външния свят и не давай повече достъп, отколкото е нужно. - Опитай се да измисляш имена, по-близки до семантиката, която искаш да изкажеш. 
@containerе ясно, че съдържа нещо, въпросът е какво?blockе ясно, че е блок, но какво прави? По принцип е добре предикатите да завършват на?. Тукfilter?ще е малко подвеждащо, но се опитай да измислиш име, което да задава въпрос. - Какво ще стане с 
TypeFilter#filter, ако се прави проверка с:real? - Не си имплементирал 
|и&за филтри. Най-лесно би било ако го сложиш въвFilterи другите го наследяват. Ако нямаш идея как да започнеш самата имплементация, а не просто не си имал време, не се притеснявай да питаш във форумите/да пратиш email. 
