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

时间:2009-10-22 08:32:38

标签: 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对象实现,我认为可以通过克隆对象之前很好地实现当处理过程中出现问题时,处理并用克隆替换修改后的对象。所以这不是我认为的有效例子。

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:8)

当您想要评估ERB templates.

时,绑定对象非常有用

答案 1 :(得分:5)

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

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

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

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

将打印

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

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

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

答案 2 :(得分:1)

看看http://www.seaside.st/,它是一个小型的Web应用程序框架。它广泛使用延续。关于如何使用它的最佳真实示例是此CMS http://www.cmsbox.com/en/cms