У меня есть DSL в Ruby, который работает следующим образом:
desc 'list all todos'
command :list do |c|
c.desc 'show todos in long form'
c.switch :l
c.action do |global,option,args|
# some code that's not relevant to this question
end
end
desc 'make a new todo'
command :new do |c|
# etc.
end
Один из разработчиков предложил мне улучшить мой DSL, чтобы он не требовал передачи c
в блок command
и, следовательно, не требовалc.
для всех методов внутри;предположительно, он подразумевал, что я мог заставить следующий код работать так же:
desc 'list all todos'
command :list do
desc 'show todos in long form'
switch :l
action do |global,option,args|
# some code that's not relevant to this question
end
end
desc 'make a new todo'
command :new do
# etc.
end
Код для command
выглядит примерно так:
def command(*names)
command = make_command_object(..)
yield command
end
Я попробовал несколько вещей и не смог получитьэто работать;Я не мог понять, как изменить контекст / привязку кода внутри блока command
, чтобы он отличался от значения по умолчанию.
Есть какие-нибудь идеи относительно того, возможно ли это, и как я могу это сделать?