我需要在我的项目中使用两个 gem,它们都声明 PDF 命名空间:pdf-reader 和 htmldoc。
有什么办法可以让他们一起愉快地玩耍吗?我能想到的唯一方法是重写我自己的 htmldoc 版本,为其提供不同的命名空间。
基本上,你无能为力。在 Ruby 中使用是一个很好的做法独特的顶级命名空间中的名称恰恰出于这个原因,您恰好偶然发现了两个违反该做法的库。
一件事你could做的就是使用Kernel#load
代替Kernel#require
. Kernel#load
接受一个可选的布尔参数,这将告诉它评估匿名模块中的文件。但请注意,这绝不是安全的:完全有可能明确地将东西放在顶级命名空间中(使用类似module ::PDF
),从而突破匿名模块。
另请注意,API 确实很糟糕:load
只是返回true
or false
, 就像require
做。 (事实上,自从load
always负载,它always回报true
.)实际上没有办法get在匿名模块中。你基本上必须把它从ObjectSpace
用手。哦,当然,由于没有任何内容实际引用匿名模块,因此它将被垃圾收集,因此您不仅需要在内部进行翻查ObjectSpace
to find该模块,你还必须race垃圾收集器。
有时,我希望 Ruby 有一个合适的模块系统,如 Newspeak、Standard ML 或 Racket。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)