【问题标题】:Why is a different binding object created each time?为什么每次都创建不同的绑定对象?
【发布时间】:2014-04-28 05:03:06
【问题描述】:

RDoc 解释说

Binding 类的对象将执行上下文封装在代码中的某个特定位置,并保留此上下文以供将来使用。 self 的变量、方法、值,以及可能在此上下文中可以访问的迭代器块都被保留。

为此,如果单个上下文具有唯一的绑定对象,这似乎是合理且有用的。但是,即使在完全相同的上下文中,连续创建绑定对象每次都会导致不同的对象:

binding # => #<Binding:0x007f29017cf8e0>
binding # => #<Binding:0x007f29017ccff0>
binding # => #<Binding:0x007f29017c8d38>

这是为什么?这个功能有什么更方便的吗?

我看到此功能的一个不便之处是,当我执行依赖于当前上下文的操作时,除了显式引用绑定对象之外别无他法。 以下最后两行返回错误,因为 binding 创建的绑定对象不被另一个创建的绑定对象或隐式上下文共享。

b = binding
b.local_variable_set(:foo, "foo")

b.local_variable_get(:foo)       # => "foo"
binding.local_variable_get(:foo) # => error
foo                              # => error

【问题讨论】:

  • 似乎新上下文被 aury 作者视为每次调用 binding 方法。可能只是为了简化对新上下文的分析,正是为了避免这种分析。
  • 对不起,那是红宝石* =)

标签: ruby local-variables


【解决方案1】:

Kernel#binding:

返回一个 Binding 对象,描述调用点的变量和方法绑定。

据我了解,Binding 对象与您创建它的位置有关。因此binding 可能不会检查上下文是否不同,而只是返回该 的新绑定。如果你想要更深入的东西,你可以看看 MRI 工具source/mri/proc.c#314

【讨论】:

    猜你喜欢
    • 2023-01-07
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 2018-05-12
    相关资源
    最近更新 更多