gpt4 book ai didi

ruby - 在 ruby​​ 中更改 block 内的上下文/绑定(bind)

转载 作者:数据小太阳 更新时间:2023-10-29 06:23:53 24 4
gpt4 key购买 nike

我有一个 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 block ,因此不需要 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 block 中代码的上下文/绑定(bind)更改为与默认值不同。

关于这是否可能以及我该如何做有什么想法吗?

最佳答案

粘贴这段代码:

  def evaluate(&block)
@self_before_instance_eval = eval "self", block.binding
instance_eval &block
end

def method_missing(method, *args, &block)
@self_before_instance_eval.send method, *args, &block
end

有关更多信息,请参阅这篇非常好的文章 here

关于ruby - 在 ruby​​ 中更改 block 内的上下文/绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5851127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com