【问题标题】:Wrapping Ruby With An Anonymous Module用匿名模块包装 Ruby
【发布时间】:2014-11-02 14:31:43
【问题描述】:

有几个 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);

这样做有什么意义?我已经测试了这些函数以及它们未包装的等效函数,结果始终相同。是否有一些我没有看到的用例?

【问题讨论】:

  • 嘿,感谢您在一年多后随机投反对票,没有发表评论。

标签: c ruby ruby-c-extension


【解决方案1】:

我应该做更多的测试。看起来这是bug

在匿名模块中包装代码的目的是不让代码中定义的常量/方法污染顶层命名空间。 rb_load 正确包装,rb_eval_string_wrap 没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2014-10-30
    • 2016-02-24
    • 2014-09-30
    相关资源
    最近更新 更多