引用在重新加载之前声明的对象!在Rails控制台中导致ArgumentError

时间:2017-02-26 14:59:35

标签: ruby-on-rails

Ruby 2.1.7和Rails 4.0.2

使用rails控制台时。我已经看到如果我在控制台中声明一个对象。比叫重载!然后使用创建另一个类的实例的代码在同一个对象上调用方法将引发错误:

ArgumentError:First的副本已从模块树中删除但仍处于活动状态!

一个例子更容易理解:

在我的app / model文件夹中,我向class声明:

应用程序/模型/ first.rb

class First
  def foo
    Second.new
  end
end

应用程序/模型/ second.rb

class Second
end

在控制台中运行此命令:

x = First.new
reload!
x.foo

比我得到例外

你能解释一下为什么会这样吗?使用在重新加载之前声明的引用是错误的吗?异常是一件好事,我不应该尝试找到解决方法,或者它显示我的代码或配置中的某些内容是错误的

我有这个问题:A copy of xxx has been removed from the module tree but is still active

一种解决方案是添加额外的::作为前缀,事实上如果我使用它:

::Second.new

我没有得到例外

您是否认为使用此解决方案是一件好事,或者是太多hacky而不是Ruby Way?

你能解释为什么这不会导致错误吗?

2 个答案:

答案 0 :(得分:1)

似乎重新加载控制台环境并尝试引用之前创建的实例并不是一件好事。所以我认为你不应该为它找到解决方法。

答案 1 :(得分:1)

这是由于Rails自动加载丢失常量的方式。在你的例子中:
1.当"秒"使用,Rails首先认为它是" First"模块,并防止使用过时的模块,它检查模块是否具有名称" First"实际存在,因为"第一"它还没有自动加载,它提出了例外。
=>这是一件好事(在你的情况下,x在使用时应该是已经定义的类的一个实例)
2.当" ::第二"使用,Rails认为它是顶级的常量,并且只是成功地解决了#34; Second"常数。
=>我觉得这是件坏事
所以,我同意Sakata,你不应该为它找到解决方法。