1

在 Rails 应用程序中,我想检查是否定义了常量,并在必要时自动加载它。defined?在自动加载发生之前,运算符返回 false 。

defined? Foo # => false :(
Foo # => Foo
defined? Foo # => true

我目前的解决方法是这样的:

begin
  Foo # try to autoload
  true
rescue NameError
  false
end

有没有更好的方法来检查是否定义了常量,但如果需要也自动加载它?


请求的理由:

用于 Rails 的 Konacha JS 测试框架应该自动获取一个固定 Ruby 文件(如果存在)。加载应该使用 Rails 的自动加载机制进行,因此它受益于自动重新加载(使用config.cache_classes = false)。

4

2 回答 2

1

听起来您正在尝试创建一个could_be_defined?尝试自动加载然后返回truefalse如您所指示的方法。

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

您的强制加载和测试方法是确定的唯一方法。有些模块可能没有通过声明,autoload但实际上是根据需要动态生成的。试图预测可能存在或不存在的东西充其量是不可靠的。

于 2012-08-15T17:27:08.947 回答
0

我有一个类似的问题,我正在加载基于约定的推断常量。我遇到的问题是这些类定义中的任何错误都被吞没了。

我想出了这个:

def const_presence(const_name)
  const_name.constantize
rescue NameError => e
  raise e unless e.message =~ /uninitialized constant #{const_name}/
end

如果未定义常量,则返回 nil,如果已定义则返回常量,但关键是允许引发加载常量时遇到的任何错误。

于 2014-10-22T08:47:55.577 回答