Я разработал класс NumberSet, который содержит массив, на котором я должен реализовать определенные фильтры, которые я разработал как классы. Код:Объединение фильтров в Ruby
class NumberSet
include Enumerable
def initialize
@arr=[]
end
def each (&block)
@arr.each do |member|
block.call (member)
end
end
def << number
@arr<<number unless @arr.include?(number)
end
def [] (sito)
@arr.select{|number| sito.filter(number)}
end
end
class Filter
attr_reader :filter
def initialize &block
@filter = block
end
def filter number
@filter.call(number)
end
end
class SignFilter
def initialize(sign)
@sign = sign
end
def filter number
return true if(@sign==:negative && number<0)
return true if(@sign==:positive && number>0)
return true if(@sign==:nonnegative && number >= 0)
return true if(@sign==:nonpositive && number <= 0)
end
end
class TypeFilter
def initialize(sign)
@sign = sign
end
def filter number
return true if (@sign==:complex && number.is_a?(Complex) == true)
return true if (@sign==:integer && number.is_a?(Integer) == true)
return true if (@sign==:real && (number.is_a?(Rational) == true
|| number.is_a?Float) == true))
end
end
Все работает хорошо, но я должен также определить &
и |
операторов, чтобы они работают как пересечения и объединения, что означает, что &
должны получить только числа, которые удовлетворяют все фильтры и |
числа, которые удовлетворяют по крайней мере, один из фильтров.
Кроме того, синтаксис
numbers[SignFilter.new(:non_negative) & Filter.new { |number| number.even? }]
должен быть действительным.
Как определить их, чтобы они работали правильно?
Чтобы ответить на некоторые замечания, я ищу способ, чтобы операторы &
, |
работу так, как я хочу их. Проблема заключается не в том, как написать синтаксис, а в том, что должен делать код между def
и end
be.
Почему у вас возникли проблемы с определением этих методов? – Brennan
@Brennan Потому что я не могу понять логически, как это сделать. – user103220
Вы можете определить их как любой другой метод: 'def &(arg); arg + 10; end', но вы должны называть их, используя send: 'self.send (« & », 10)' – Brennan