如何在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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Flex 学习之路之四 用户接口user interface 的三种状态
- ajax – IOS9 WKWebView访问控制允许源
- group-policy – 我通过软件安装策略部署了Flash Player.如
- ruby-on-rails – 如何在rails上使用ruby进行自引用?
- ios – 在生产构建中遇到断言导致崩溃
- c# – 什么是属性或属性界面的一个很好的(自然语言)命名方案
- vue脚手架及vue-router基本使用
- cocos2dx休闲游戏--Fruit & Bird 开发学习(3)———R
- 使用 Webpack 4 和 Babel 7 创建 React 应用程序
- C# 在项目中引用x86 x64的非托管代码的方法