【发布时间】:2011-08-16 14:32:36
【问题描述】:
我在 Ruby 中有一个 DSL,它的工作原理如下:
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 块内代码的上下文/绑定更改为不同于默认值。
关于这是否可能以及我如何做到这一点的任何想法?
【问题讨论】:
标签: ruby metaprogramming block