浏览 1876 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-06-09
Bindings 提供了Ruby代码计算的上下文环境。一个binding是一组存在于代码特定位置的变量和方法。Ruby代码任何语句都可一个计算成一个binding,这个binding可以通过Kernel#bindding获得。Binding是Binding类的对象,他们可以像其他的对象一样传递: class C binding # => #<Binding:0x2533c> def a_method binding end end binding # => #<Binding:0x252b0> C.new.a_method # => #<Binding:0x25238> Rails的脚手架产生器提供了一个使用binding的很好的例子 class ScaffoldingSandbox include ActionView::Helpers::ActiveRecordHelper attr_accessor :form_action, :singular_name, :suffix, :model_instance def sandbox_binding binding end # ... end ScaffoldingSandbox是一个提供为渲染一个模版的干净环境。ERb可以在一个binding的上下文里渲染一个模版,因此在ERb的模版里创建了一个是可用的API。 part_binding = template_options[:sandbox].call.sandbox_binding # ... ERB.new(File.readlines(part_path).join,nil,'-').result(part_binding) 前面提到代码块是一个闭包。一个闭包的binding表现为他的状态——一个它要访问的变量和方法的集合。可以用Proc#binding得到一个闭包的binding: def var_from_binding(&b) eval("var", b.binding) end var = 123 var_from_binding {} # => 123 var = 456 var_from_binding {} # => 456 这里我们用了Proc作为一个方法用来的到binding。通过访问代码块的binding(上下文),可以在binding上用简单的eval访问局部变量。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |