微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Ruby块,过程和局部变量

Ruby中,procs似乎可以访问声明它们时出现的局部变量,即使它们在不同的范围内执行:
module Scope1
    def self.scope1_method
        puts "In scope1_method"
    end
end

module Scope2
    def self.get_proc
        x = 42
        Proc.new do
            puts x
            puts self
            scope1_method
        end
    end
end

Scope1.instance_eval(&Scope2.get_proc)

输出

42
Scope1
In scope1_method

这是怎么发生的?

解决方法

Proc.new调用为它给出的块创建一个 closure.在为块创建闭包时,块绑定到Proc.new调用范围内的原始变量.

为什么这样做?

它允许Ruby块作为闭包.闭包非常有用,维基百科条目(上面链接)在解释他们的一些应用程序方面表现非常出色.

这是怎么做到的?

这是通过在进入Proc.new方法之前复制存在的Ruby控件框架在Ruby VM(在C代码中)完成的.然后在该控制帧的上下文中运行该块.这有效地复制了此框架中存在的所有绑定.在Ruby 1.8中,您可以在eval.c的proc_alloc函数中找到相应的代码.在Ruby 1.9中,您可以在proc.c中的proc_new函数中找到它.

原文地址:https://www.jb51.cc/ruby/268276.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐