【问题标题】:Real-world use of binding objects in rubyruby 中绑定对象的实际使用
【发布时间】:2009-10-22 08:32:38
【问题描述】:

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

我想知道这些语言功能的实际用途是什么。以我的经验,一切都可以用静态类型的oo语言来完成,但我有时不太聪明地同意。我想我发现了继续阅读 Sam Ruby 的那篇好文章的美丽/兴趣:http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

仍然,我迷失了 Binding 对象。有人可以为我提供一些真实世界的例子,这些例子可以用 Binding 对象巧妙地完成,但对于缺少 ruby​​ Binding 概念的语言来说不是很聪明?

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

提前感谢您的帮助。

【问题讨论】:

    标签: ruby computer-science


    【解决方案1】:

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

    【讨论】:

    • 您能详细说明一下吗?我没明白你的意思。
    • @SylvainPrat:ERB#result 方法采用Binding 对象。您可以简单地使用内核方法binding 来获取它,直接调用my_template.result(binding) -- 它使用当前上下文执行模板中的 Ruby 代码)
    【解决方案2】:

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

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

    您可以使用它来检查 Ruby 代码的 sn-ps 列表以及每个 sn-p 返回的内容:

    # .. 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 中使用它。可能还有其他方法可以实现这一点,但使用绑定既简单又快速。可能还有更好的例子来说明绑定对象的用途......

    【讨论】:

    • 谢谢!这是对的!实现调试功能似乎是 Binding 对象的一种用途。我想知道这个调试功能是否被记录为镐书中的绑定示例。你能看到 Binding 对象的其他用途吗?
    • @dhruv 这很漂亮。我想我会将它添加到我的实用程序包中,就在 putsv 旁边(如果详细,则放置)等...谢谢!
    【解决方案3】:

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

    【讨论】:

    • 感谢您的回答,但我的问题更多是关于绑定对象而不是继续;)
    猜你喜欢
    • 2015-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 1970-01-01
    • 2016-11-15
    • 2015-08-28
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多