в дальнейшем - это моя часть кода, которую я хочу упростить, чтобы избежать передачи дополнительного аргумента для каждого вызова. На самом деле, мой usecase заключается в том, что M
является пользовательской библиотекой без определения аргумента context
для каждого метода. check
- это метод, который не определен пользователем.Как получить объект контекстного вызова в Ruby?
# User code
module M
def do_something(context)
puts "Called from #{context}"
context.check
end
module_function :do_something
end
# Application code
class Bar
def check
puts "Checking from #{self}..."
end
end
class Foo < Bar
def do_stuff(scope, method)
scope.send method, self
end
end
# Executed by user
Foo.new.do_stuff M, :do_something
Есть ли способ сделать то же думать, не проходя self
в качестве входного аргумента do_something
метод для того, чтобы восстановить check
метод?
# User code
module M
def do_something
called_from_object = ???
puts "Called from #{called_from_object}"
called_from_object.check
end
module_function :do_something
end
# Application code
class Bar
def check
puts "Checking from #{self}..."
end
end
class Foo < Bar
def do_stuff(scope, method)
scope.send methood
end
end
# Executed by user
Foo.new.do_stuff M, :do_something
Благодарим за поддержку!
Я посмотрел на Сравнительном модуле, но я не вижу связи между моим вопросом и этим модулем ... Вы можете пойти более в деталь? – David
Когда модуль был исправлен как конкретный модуль (например, 'M' в исходной версии вопроса), тогда класс' Foo' мог просто включать 'M', а затем, когда' do_stuff' вызывал включенное 'do_something' self, было бы экземпляр Foo. Однако, если модуль передается как параметр do do_stuff (как в обновленном примере), то я думаю, вам понадобится другой подход. – mikej
Благодарим за эту обратную связь. Я согласен в случае с конкретным модулем 'M'. Мой первоначальный пост был конкретным случаем, который не отражал то, что я действительно хочу сделать. – David