界定?用于自动加载的课程

时间:2012-08-15 16:40:38

标签: ruby-on-rails ruby

在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)。

2 个答案:

答案 0 :(得分:1)

听起来您正在尝试创建could_be_defined?方法尝试自动加载,然后按照您的指示返回truefalse

在您尝试使用它之前,无法确定某个类是否存在。这是高度动态语言的优势之一。缺点是不确定性。

您的强制加载和测试方法是确定的唯一方法。某些模块可能不会通过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;如果是常量,则返回常量,但关键是允许在加载常量时遇到任何错误。