有几个Ruby C API函数用于运行一些Ruby代码。大多数只是在像require
这样的隔离绑定中运行代码。但有些人在运行之前首先将代码包装在匿名模块中。例如,rb_load
会为您是否要进行此换行设置一个参数,rb_eval_string_wrap
只是rb_eval_string_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);
这样做有什么意义?我已经测试了这些功能以及它们的未包装的等价物,结果总是一样的。是否有一些用例我没有看到?
答案 0 :(得分:0)
我应该做更多的测试。看起来这是bug。
在匿名模块中包装代码的关键是不要使用代码中定义的常量/方法来污染顶级命名空间。 rb_load
正确包裹,rb_eval_string_wrap
没有。