Sempre me incomodou que o #include? método em ruby ​​trata o contêiner (neste caso, uma matriz) como o assunto do método. em minha própria mente distorcida, era estranho não pensar no elemento que procuro como o assunto.
Então eu fiz isso:
module ReverseInclude
def self.included(base)
base.class_eval do
extend ClassMethods
include InstanceMethods
end
end
module InstanceMethods
def included_in?(arr = [])
arr.include?(self)
end
def not_included_in?(arr = [])
!(included_in?(arr))
end
end
module ClassMethods
end
end
Object.send(:include, ReverseInclude)
um pequeno módulo curto e feliz (sai pela culatra no objeto, como você pode ver) e adiciona o #included_in? e o #não incluÃdo em? métodos para cada objeto no sistema e basicamente permite o seguinte:
@item.included_in?(array)
e
@item.not_included_in?(array)
Inicialmente pensei em estender o módulo Enumerable, mas por enquanto parecia ser o suficiente apenas expor esses métodos em um módulo autônomo.