我的职能是:
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/