I have a DSL in Ruby that works like so:
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
A fellow developer suggested I enhance my DSL to not require passing c
to the command
block, and thus not require the c.
for all
the methods inside; presumably, he implied I could make the following code work the same:
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
The code for command
looks something like
def command(*names)
command = make_command_object(..)
yield command
end
I tried several things and was unable to get it to work; I couldn't figure out how to change the context/binding of the code inside the command
block to be different than the default.
Any ideas on if this is possible and how I might do it?
question from:
https://stackoverflow.com/questions/5851127/change-the-context-binding-inside-a-block-in-ruby 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…