Ruby的Block浅析

最近在看Ruby Under a Microscope分析Ruby内部的运行机制,准备写一些总结
首先从Ruby的Block写起吧(原文是第8章)

Ruby的Block就是Ruby中的Closure Closure.Closure这个概念是从Lisp中得到的,有两个部分构成

1.一个能够运行的代码片段
2.供这个代码片段运行的环境

Ruby中是这么处理Block的,在运行闭包前,会创建一个rb_block_t的结构,这个结构中有两个指针,一个iseq指向闭包的代码片段(字节码),另一个EP指向YARV internal stack的运行环境。

Example

str = "The quick brown fox"
10.times do
  str2 = "jumps over the lazy dog"
  puts "#{str} #{str2}"
end 

这个代码就会在internal stack上创建三个rb_control_frame_t ,最底下的是整个代码已进入压进去的(你可以想象这个代码是在一个函数中实现并被调用的),第二个是10.times运行的时候Fixnum#times为了调用内部的C code压的,第三个是运行闭包时压的。但是第三个运行闭包的时候压的不是rb_control_frame_t而是rb_block_t,这两个结构十分像,你可以当作是差不多的东西,在创建第三个stack frame的时候,他的环境EP跟第二个是一样的(实际上应该就是使用第二个stack frame所在的内存,因为这两个结构很像,只需要加上一个offset就能得到rb_block_t所需要的struct element了)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。