instance_exec
для спасения!
class Filter
def initialize
@arg = 'foo'
end
def self.filters &block
define_method :filter do |els|
els.select { |e| self.instance_exec(e, &block) }
end
end
end
class Foo < Filter
filters {|el| el == @arg }
end
Foo.new.filter(%w[notthearg either foo other])
# => ["foo"]
Внимание: убедитесь, что это очень хорошо задокументировано, так как любые махинации с участием instance_exec
или его кузенов нарушают ожидания программистов иПравильно - замысел, вы разрушаете понятие «сфера».Я почти уверен, что OP знает об этом, но стоит остановиться на пресловутой статье.
Кроме того, рассмотрите возможность использования средств доступа, а не простых переменных экземпляра - средства доступа проверены, а переменные - нет.т. е. { |el| el == urg }
приведет к ошибке, но { |el| el == @urg }
произойдет сбоем (и отфильтруется по nil
).