昨晚,我正在考虑我认为的高级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对象实现,我认为可以通过克隆对象之前很好地实现当处理过程中出现问题时,处理并用克隆替换修改后的对象。所以这不是我认为的有效例子。
提前感谢您的帮助。
答案 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