Advanced Rails -- Ruby 基本技术(8) -- 元编程技巧3

[i][b]Bindings[/b][/i]

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访问局部变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值