C 用匿名模块包装Ruby
有几个Ruby C API函数用于运行一些Ruby代码。大多数只是在一个独立的绑定中运行代码,比如C 用匿名模块包装Ruby,c,ruby,ruby-c-extension,C,Ruby,Ruby C Extension,有几个Ruby C API函数用于运行一些Ruby代码。大多数只是在一个独立的绑定中运行代码,比如requiredoes。但其中一些在运行之前先将代码包装在匿名模块中。例如,rb\u load使用一个参数来确定您是否需要此包装,rb\u eval\u string\u wrap只是rb\u eval\u string\u protect但需要包装 在C中,包装如下所示: /* load in anonymous module as toplevel */ th->top_self = rb
require
does。但其中一些在运行之前先将代码包装在匿名模块中。例如,rb\u load
使用一个参数来确定您是否需要此包装,rb\u eval\u string\u wrap
只是rb\u eval\u string\u protect
但需要包装
在C中,包装如下所示:
/* load in anonymous module as toplevel */
th->top_self = rb_obj_clone(rb_vm_top_self());
th->top_wrapper = rb_module_new();
rb_extend_object(th->top_self, th->top_wrapper);
这样做有什么意义?我已经测试了这些函数以及它们的未包装等价物,结果总是一样的。是否有一些用例我没有看到?我应该做更多的测试。看起来这是一个很好的例子
在匿名模块中包装代码的要点是不要用代码中定义的常量/方法污染顶级命名空间
rb\u load
是否正确包装,rb\u eval\u string\u wrap是否正确包装。嘿,感谢一年后的随机否决投票,没有任何评论。