在Rails应用程序中,我想检查是否定义了常量,必要时自动加载。 defined?
运算符返回false,直到自动加载发生。
defined? Foo # => false :(
Foo # => Foo
defined? Foo # => true
我目前的解决方法是:
begin
Foo # try to autoload
true
rescue NameError
false
end
有没有更好的方法来检查是否定义了常量,还是在必要时自动加载?
按要求提出的理由:
Rails的Konacha JS测试框架应该自动获取一个fixture文件(如果存在)。加载应该使用Rails的自动加载机制,因此它可以自动重新加载(使用config.cache_classes = false
)。
答案 0 :(得分:1)
听起来您正在尝试创建could_be_defined?
方法尝试自动加载,然后按照您的指示返回true
或false
。
在您尝试使用它之前,无法确定某个类是否存在。这是高度动态语言的优势之一。缺点是不确定性。
您的强制加载和测试方法是确定的唯一方法。某些模块可能不会通过autoload
声明,但实际上是根据需要动态生成的。试图预测可能存在或不存在的东西充其量是不可靠的。
答案 1 :(得分:0)
我有一个类似的问题,我根据约定加载推断的常量。我遇到的问题是这些类的定义中的任何错误都被吞没了。
我想出了这个:
def const_presence(const_name)
const_name.constantize
rescue NameError => e
raise e unless e.message =~ /uninitialized constant #{const_name}/
end
如果未定义常量,则返回nil;如果是常量,则返回常量,但关键是允许在加载常量时遇到任何错误。