2009-10-22 69 views
5

昨天晚上,我想到了我认为的高级ruby语言功能,即继承(callcc)和绑定对象。我的意思是先进的,因为我有一个静态类型的oo langages背景(C#,Java,C++),最近我发现了ruby,所以这些语言特性对我来说并不是很熟悉。真实世界中使用绑定对象的红宝石

我想知道什么可能是真实世界使用这些语言功能。根据我的经验,任何事情都可以用静态类型的oo语言来完成,但我有时不太聪明。我想我已经找到了继续阅读Sam Ruby的漂亮文章的美丽/兴趣:http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

不过,我迷失在Binding对象中。有人能给我提供一些真实世界的例子,可以用Binding对象巧妙地完成某些事情,但是对于忽略ruby Binding概念的语言来说不是很聪明?

我在考虑在长时间运行过程中出现问题时将某些对象回滚到其初始状态,但我不确定这是否可以用Binding对象实现,我认为可以通过克隆对象在处理过程中出现错误时处理并用它们的克隆替换修改的对象。所以这不是我想的有效例子。

在此先感谢您的帮助。当你要评估ERB templates.

回答

5

我用绑定类来实现调试黑客

+0

谢谢!这是对的!实现调试功能似乎是Binding对象的一种用法。我想知道这个调试功能是否被记录为镐书中绑定的一个例子。你能看到绑定对象的其他用途吗? – 2009-10-27 13:33:41

+0

@dhruv这很漂亮。我想我会将它添加到我的实用程序包中,旁边的putsv(如果详细放置)等...谢谢! – Ryanmt 2014-01-30 00:12:28

8

绑定对象是有用的。

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被调用的作用域,以便在运行debug时可以在eval中使用。有可能有其他方法来实现这一点,但使用绑定很容易和快速。也可能有更好的例子,说明什么绑定对象可用于...

+1

你能否详细说明一下?我不明白你的意思。 – 2009-10-24 09:02:48

+2

@SylvainPrat:ERB#结果方法需要一个'Binding'对象。你可以通过使用内核方法'binding'来获得它,直接调用'my_template.result(binding)' - 它在当前上下文中执行模板中的Ruby代码) – 2013-11-20 00:09:33

1

看看http://www.seaside.st/,它是一个小型的web应用程序框架。它广泛使用延续。关于如何使用它的最好的现实世界的例子是这个CMS http://www.cmsbox.com/en/cms

+0

感谢您的回答,但我的问题是关于绑定对象而不是延续;) – 2009-10-27 13:28:45