Вы можете использовать instance_eval
:
class Bar
def do_something
validator = AllValidator.new.age_validator
# Evaluate validator in the context of self.
instance_eval &validator
end
end
Если вы хотите передать аргументы (как указано в комментарии ниже), вы можете использовать instance_exec
вместо instance_eval
, если вы используете Ruby 1.9 или Ruby 1.8.7:
class Bar
def do_something
validator = AllValidator.new.age_validator
# instance_exec is like instance_eval with arguments.
instance_exec 5, &validator
end
end
Если вам нужно, чтобы он работал и с Ruby 1.8.6 и ниже, лучше всего связыватьсяproc как метод Bar
:
class Bar
def do_something
self.class.send :define_method, :validate, &AllValidator.new.age_validator
self.validate 5
end
end
Альтернативой является реализация instance_exec
старых версий Ruby ( пример здесь ).Все, что он делает, это определяет метод перед его вызовом и отменяет определение после того, как вы его сделали.