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

标签 ruby lambda dsl proc

我的职能是:

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

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

我想在我的方法 block 中临时扩充一个函数。

hello_scope , 我只是想在 scope 前面加上字符串到 str在将其传递给原始 hello 之前方法。这是一个例子:

hello 'world'               #=> hello world

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

当涉及到 Ruby 中的这类事情时,我有点菜鸟。谁能帮我优雅地解决这个问题?


编辑:

如果它使事情变得更简单,我们可以将方法作为参数传递给 block ,例如:

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

最佳答案

一种方法是创建一个“评估上下文对象”, block 将在其上进行实例评估。该对象必须提供特定于该 block 的所有方法。在下面的示例中,我没有使用相同的名称,因为我不记得如何显式引用全局方法“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

关于ruby - 如何在 Ruby 中创建这个小型 DSL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15562888/

相关文章:

ruby - 将 StringIO 写入临时文件

Java - 使用流 + lambdas 的多个集合的交集

javascript - 什么是 lambda 语言?

eclipse - 如何修复xtext上的简单错误?

ruby-on-rails - 运行 Ruby Rails App 时出现 NoDatabaseError

ruby-on-rails - Rails 3(Ruby 1.9.2 vs 1.8.6)和(MRI vs REE vs JVM)——评论/建议?

ruby-on-rails - 获取所有 child 的 child 等等

java - 错误 : unreported exception IOException; must be caught or declared to be thrown in stream()

c# - 如何将特定的Elasticsearch DSL查询转换为嵌套查询?

scala - Camel 日志错误