Людмила обнови решението на 25.10.2014 11:12 (преди около 11 години)
+class Filter
+
+  def initialize(&block)
+    @block = block
+  end
+  attr_accessor :block
+
+  def &(filter)
+    new_block = Proc.new { |number| filter.block.call(number) &&
+                                    @block.call(number)}
+    Filter.new(&new_block)
+  end
+end
+
+
+class TypeFilter
+
+  def initialize(filter_type)
+    @filter_type = filter_type
+    @block = self.set_filter
+  end
+  attr_accessor :block
+
+  def set_filter
+    case @filter_type
+      when :integer then
+        @block = Proc.new { |number| number.instance_of?(Integer) }
+      when :real    then
+        @block = Proc.new { |number| number.instance_of?(Float) ||
+                                     number.instance_of?(Rational) }
+      when :complex then
+        @block = Proc.new { |number| number.instance_of?(Complex) }
+    end
+  end
+
+  def &(filter)
+    block = Proc.new { |number| filter.block.call(number) &&
+                                @block.call(number)}
+    Filter.new(&block)
+  end
+end
+
+
+class SignFilter
+
+  def initialize(filter_type)
+    @filter_type = filter_type
+    @block = self.set_filter
+  end
+
+  attr_accessor :block
+
+  def set_filter
+    case @filter_type
+      when :positive     then @block = Proc.new { |number| number >  0 }
+      when :non_positive then @block = Proc.new { |number| number <= 0 }
+      when :negative     then @block = Proc.new { |number| number <  0 }
+      when :non_negative then @block = Proc.new { |number| number >= 0 }
+    end
+  end
+
+  def &(filter)
+    new_block = Proc.new { |number| filter.block.call(number) &&
+                                    @block.call(number)}
+    Filter.new(&new_block)
+  end
+end
+
+
+class NumberSet
+
+  def initialize
+    @elements = []
+  end
+
+  def <<(new_element)
+    @elements << new_element unless @elements.include? new_element
+  end
+
+  def [](filter)
+    filtered_set = NumberSet.new
+    (@elements.select(& filter.block)).each { |number| filtered_set << number }
+  end
+
+  def size
+    @elements.length
+  end
+
+  def empty?
+    @elements.empty?
+  end
+end
Знам, че мизерийката с (@elements.select(& filter.block)) е лош workaround за scepttic проблема, който имах, когато събмитвах, но за съжаление опитите ми да променя нещата и да не го достъпвам така блока не бяха успешни :D Ще се радвам на допълнителна помощ
Здрасти,
Ето няколко коментара по кода ти:
- Не оставяй празен ред преди първия метод в клас.
 - 
attr_accessor-ите по принцип е добре да се пишат преди методите. Те също се разделят с празен ред. В случаяattr_accessor-и не ти трябват, така че ги махни. - Относно проблема ти с 
filter.block. Защо не направиш метод въвFilter, който да приема число и тялото му да е нещо като@block.call number? Така ще можеш да използваш този метод за проверка на число, а не да достъпваш анонимната функция, която пазиш във филтъра. - Имаш излишни скоби около 
@elements.select(...). - Помисли какъв резултат връщаш в 
NumberSet#[]. Ние очаквамеNumberSetобратно. - 
Filter#&,TypeFilter#&иSignFilter#&много си приличат. Не може ли да reuse-неш по някакъв начин? - Във 
Filter#&според мен не ти е нуженProc-а. Помисли си за блокове. 
Струва ми се, че ти липсват някои неща. Прочети пак условието. :))
