现实世界中使用ruby中的绑定对象

Syl*_*rat 5 ruby computer-science

昨晚,我在考虑我认为的高级ruby语言功能,即Continuations(callcc)和Binding对象.我的意思是高级,因为我有一个静态类型的语言背景(C#,Java,C++),我最近发现了ruby,所以这些语言功能对我来说并不是很熟悉.

我想知道这些语言功能的真实用途是什么.根据我的经验,一切都可以用静态类型的语言来完成,但我有时并不是很聪明.我想我已经想出了继续阅读的美丽/兴趣来自Sam Ruby的精彩文章:http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

不过,我迷失了Binding对象.有人可以为我提供一些真实世界的例子,可以通过Binding对象巧妙地完成,但不是非常聪明地使用缺少ruby Binding概念的语言吗?

我想在长时间运行过程中出现问题时将某些对象回滚到初始状态,但我不确定这可以用Binding对象实现,我认为可以通过在处理和替换之前克隆对象来非常巧妙地实现当处理过程中出现问题时,修改对象及其克隆.所以这不是我认为的有效例子.

在此先感谢您的帮助.

On *_*und 8

当您想要评估ERB模板时,绑定对象很有用.

  • @SylvainPrat:ERB#results方法接受一个`Binding`对象.您可以使用Kernel方法`binding`来获取它,直接调用`my_template.result(binding)` - 它使用当前上下文在模板中执行Ruby代码) (2认同)

小智 5

我已经使用绑定类来实现调试hack.

class Array
  def debug binding
    each do |arg|
      puts "arg = #{eval(arg, binding).inspect}"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以使用它来检查Ruby代码片段的列表以及每个片段返回的内容:

# .. some hairy code you want to debug ...
['user','current_resource', 'user.owns?(current_resource)'].debug(binding)
Run Code Online (Sandbox Code Playgroud)

这将打印

user = #<User id:1, username: 'joe', ...
current_resource = #<Comment id:20, ...
user.owns?(current_resource) = false
Run Code Online (Sandbox Code Playgroud)

我发现它对于快速调试非常有用.

我需要使用绑定对象来捕获debug调用的范围,以便可以在运行eval时使用它debug.可能还有其他方法可以实现这一点,但使用绑定非常简单快捷.还有更好的例子,说明哪些绑定对象对...有用.