Людмила обнови решението на 25.10.2014 11:12 (преди около 10 години)
+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
-а. Помисли си за блокове.
Струва ми се, че ти липсват някои неща. Прочети пак условието. :))