gpt4 book ai didi

ruby - 如何修改传递给 block 的范围?

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

我使用 Ruby 还不到一年,但我仍然不完全理解“是什么让 block 运行”。特别是我很好奇一个人对一个 block 的范围有多少控制权。例如,假设我有这段代码:

class Blob
attr_accessor :viscosity
def configure(&:block)
block.call self
end
end

blob = Blob.new
blob.configure do |b|
b.viscosity 0.5
end

显然,这是一个人为的例子。

现在,在从 Rails 2 迁移到 Rails 3 时我注意到的一件事是,他们的许多采用 block 的配置方法不再采用非 block 参数。

比如在routes.rb中,原来是ActionController::Routing::Routes.draw do |map| ...结束,现在只是ActionController::Routing::Routes.draw do ...end。但是在 block 内部调用的方法仍然具有适当的上下文,而不需要一遍又一遍地重复 block 参数的名称。

那么,在我上面的例子中,我希望能够做到:

blob.configure do
viscosity 0.5
end

这样我就可以告诉人们用 Ruby 编写 DSL 是多么容易。 :)

最佳答案

这使用 instance_eval 来施展魔法。参见 http://apidock.com/ruby/Object/instance_eval/对于一些文档。 instance_eval 在其接收者的上下文中评估 block (或字符串)。

def configure(&block)
self.instance_eval &block
end

您仍然必须在示例 block 中使用访问器方法 viscosity= 否则您必须定义

def viscosity(value)
@viscosity = value
end

在你的类里面。

关于ruby - 如何修改传递给 block 的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5223111/

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