相当于Python';Ruby中的动态导入语句?

相当于Python';Ruby中的动态导入语句?,ruby,dynamic,import,Ruby,Dynamic,Import,在python中,要动态加载模块,只需使用语句并将模块分配给变量,即(从文档中): 为了模拟动态模块加载/卸载,我在python中多次使用了此选项,因为要“卸载”模块,您只需删除对它的所有引用,即: spam = None Ruby中是否有与此等效的工具?我看了一些其他的问题(,和),但我想知道一种将加载的模块约束到变量的方法,如果可能的话。不,不可能。如果需要或加载Ruby中的文件,则将该文件导入全局名称空间。这是否符合您的要求 require 'bigdecimal/math' # a m

在python中,要动态加载模块,只需使用语句并将模块分配给变量,即(从文档中):

为了模拟动态模块加载/卸载,我在python中多次使用了此选项,因为要“卸载”模块,您只需删除对它的所有引用,即:

spam = None

Ruby中是否有与此等效的工具?我看了一些其他的问题(,和),但我想知道一种将加载的模块约束到变量的方法,如果可能的话。

不,不可能。如果
需要
加载Ruby中的文件,则将该文件导入全局名称空间。

这是否符合您的要求

require 'bigdecimal/math' # a module from stdlib
bm = BigMath # a module is just an object
BigMath = nil # yields a warning, but BigMath is gone.
puts bm.log(10, 40).to_s # it's alter ego lives.
#=> 0.230258509299404568401799145468436420760110148862877297632502494462371208E1 

顺便说一句,Ruby并没有一个单一的导出对象的概念,一个
require
d文件可以分配给一个变量;因此,我不知道你会怎么做


但是,请注意,您仍然可以使用
remove_const
之类的方法来取消已加载的类的定义。

实际上,如果使用第二个参数“wrap”(将在匿名模块内执行代码),则
load
不会加载全局命名空间中的代码。但由于没有办法(据我所知)访问这个匿名模块,所以差别不大。另外,globals仍然会污染全局名称空间。在做了一些测试之后,您提出的方法似乎工作得最好,但我不喜欢它。即使使用
remove\u const
清理自己的身体,这似乎也不是一个好的做法。我不喜欢Ruby像Python一样忽略将导入的文件作为自己的对象处理(因为这样做是有意义的,IMHO)。诚然,许多其他语言似乎比Ruby更不允许您这样做。但我想我会考虑重新设计而不是做这样的事情——它只是感觉太陈腐了。模块定义了一个对象,然后你可以随心所欲地处理这个对象。呃,我觉得这个额外的步骤是一个信号,表明一开始就不应该这样做。所以我将避免它。FWIW,我相信Rails自动加载程序在开发模式下运行时使用
remove\u const
强制重新加载更改的类。但是,是的,在大多数情况下,之后不应该有任何东西需要清理。RubyGems和库通常在不污染全局名称空间方面做得很好,而exports对象可能对模块的功能有太多的限制。
require 'bigdecimal/math' # a module from stdlib
bm = BigMath # a module is just an object
BigMath = nil # yields a warning, but BigMath is gone.
puts bm.log(10, 40).to_s # it's alter ego lives.
#=> 0.230258509299404568401799145468436420760110148862877297632502494462371208E1