Может быть, вы могли бы связать вызовы методов, построить стек оценки и выполнить позже.Это требует, чтобы вы вызвали дополнительный метод для оценки стека.Вы можете использовать частные методы для реальных реализаций.
class Weirdo
def initialize
@stack = []
end
def method_a
@stack << [:method_a!]
self #so that the next call gets chained
end
def method_b(arg1, arg2)
@stack << [:method_b!, arg1, arg2]
self
end
def method_c(&block)
@stack << [:method_c!, block]
self
end
def call_stack
while @stack.length > 0 do
send *@stack.pop
end
end
private
# actual method implementations
def method_a!
# method_a functionality
end
def method_b!(arg1, arg2)
# method_b functionality
end
def method_c!(&block)
# method_c functionality
end
end
, чтобы вы могли сделать что-то вроде
w = Weirdo.new
w.method_a.method_b(3,5).method_c{ Time.now }
w.call_stack # => executes c first, b next and a last.
Обновить
Похоже, мне удалось пропустить Ответ Пита и опубликован почти точно такой же ответ.Единственная разница заключается в возможности передавать аргументы во внутренний стек.