Мне нужен метод класса step
, который динамически создает методы экземпляра.
step(:start) do |payload|
puts payload
end
Это создаст эквивалент:
def start(payload)
payload
end
Проблема, с которой я сталкиваюсь, заключается вполучение блока, переданного в метод класса, оценивают в контексте экземпляра.
Кажется, проблема в том, что блок, поскольку он является замыканием, оценивается в контексте того, где был определен класс.
module Steps
def step(name, &block)
define_method(name) do |payload|
self # => Foo instance
block.call(payload)
end
end
end
class Foo
extend Steps
step(:start) do |payload|
self # => Foo class
payload # => 1
self.data # => undefined method `data' for Foo:Class (NoMethodError)
end
def data
'DATA'
end
end
puts Foo.new.start(1)
Можно ли оценить блок в контексте экземпляра?
Самое близкое, что я получил, - это использование instance_eval
, однако я не могу понять, какпередать аргумент payload
в блок:
define_method(name) do |payload|
instance_eval(&block)
end
Когда я делаю выше self
в переданном блоке, это экземпляр Foo
, поэтому я могу вызвать data
, но как получить доступpayload