加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何在Ruby中创建这个小DSL?

发布时间:2020-12-17 02:34:05 所属栏目:百科 来源:网络整理
导读:我的职责是: def hello(str) puts "hello #{str}"enddef hello_scope(scope,block) # ???end 我想暂时在我的方法块中增加一个函数. 在hello_scope中,我只想在将范围字符串传递给原始hello方法之前将其添加到str之前.这是一个例子: hello 'world' #= hello
我的职责是:

def hello(str)
  puts "hello #{str}"
end

def hello_scope(scope,&block)
  # ???
end

我想暂时在我的方法块中增加一个函数.

在hello_scope中,我只想在将范围字符串传递给原始hello方法之前将其添加到str之前.这是一个例子:

hello 'world'               #=> hello world

hello_scope "welcome!" do
  hello 'bob'               #=> welcome!hello bob
  hello 'alice'             #=> welcome!hello alice
end

当谈到Ruby中的这种事情时,我就是一个菜鸟.有人能帮助我以优雅的方式解决这个问题吗?

编辑:

如果它使事情变得更容易,那么如果我们将方法作为参数传递给块,则可以,例如:

hello_scope "welcome!" do |h|
  h "bob"                     #=> welcome!hello bob
  h "alice"                   #=> welcome!hello alice
end

解决方法

一种方法是创建一个“评估上下文对象”,块将在该对象上实例化.该对象必须提供特定于块的所有方法.在下面的示例中,我没有使用相同的名称,因为我不记得如何显式引用全局方法“hello”(以避免无限递归).在一个合适的库中,“hello”将被定义为某个类方法,因此这不是问题.

例如

def hello(str)
  puts "hello #{str}"
end
class HelloScope
  def h(str)
    print scope
    hello(str)
  end
end
def hello_scope(scope,&block)
  HelloScope.new(scope).instance_eval(&block)
end

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读