Ruby块,过程和局部变量
发布时间:2020-12-17 04:16:42 所属栏目:百科 来源:网络整理
导读:在 Ruby中,procs似乎可以访问声明它们时出现的局部变量,即使它们在不同的范围内执行: module Scope1 def self.scope1_method puts "In scope1_method" endendmodule Scope2 def self.get_proc x = 42 Proc.new do puts x puts self scope1_method end enden
在
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函数中找到它. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- ORACLE 给用户授权truncate table 的实现方案
- flash – 通过Loader将参数传递给swf
- cocos2d-x架构和目录结构(摘自官方文档)
- 详解C语言中freopen()函数和fclose()函数的用法
- 在Oracle 11g中恢复RMAN Oracle 10g备份
- 史上最简单的SpringCloud教程 | 第十三篇: 断路器聚合监控
- React-native fbsdk构建错误
- Unable to open connection to "Oracle, Microsoft pro
- AjaxControlToolkit的安装与使用详解
- AgensGraph —— 基于 PostgreSQL 的图数据库 |&nbs