需要与核心Ruby文件同名的Rails lib文件

阿卜杜

在铁轨之外,我有以下内容:

|- file1.rb
|- matrix.rb

具有以下内容:

# in matrix.rb
class Matrix
  def foo
    puts 'foo'
  end
end

# in file1.rb
require_relative 'matrix'
require 'matrix'

Matrix.build(1,1) { 0 }.foo

运行ruby file1.rb输出:

我能够包括并调用我的矩阵文件和核心矩阵类。

在Rails中,我具有以下目录结构:

|- lib
|-- core_ext
|--- matrix.rb
|- test
|-- lib
|--- core_ext
|---- matrix_test.rb

内容:

# in test/lib/core_ext/matrix_test.rb
require 'test_helper'
require_relative "#{Dir.pwd}/lib/core_ext/matrix.rb"
require 'matrix'

class MatrixTest < ActiveSupport::TestCase
  test 'matrix foo' do
    Matrix.new.foo
    Matrix.build(1,1) { 0 }.foo
    assert true
  end
end

运行时rake test test/lib/core_ext/matrix_test.rb,我得到NoMethodError: undefined method 'build' for Matrix:Class,这意味着尚未加载核心“矩阵”文件。

我通过重命名我的lib文件来解决此问题,但我确实希望在不重命名文件的情况下包括Ruby的核心Matrix和我的Matrix。有什么建议?

ps:我使用的是ruby 2.1.4p265和Rails 4.1.6

阿卜杜

因此,我认为这与Rails的自动加载有关,后者重写const_missing并弄乱了Ruby中本来需要文件的方式。http://urbanautomaton.com/blog/2013/08/27/rails-autoloading-hell/

问题是,无论我在Ruby中的要求顺序如何,都将同时加载我的“矩阵”和核心矩阵,并且代码按预期方式运行。

当Rails运行并尝试自动加载时lib/core_ext/matrix.rb,期望它可以定义CoreExt::Matrix当我require 'matrix'在代码中进行操作时,这返回的是false:核心矩阵库没有被加载,因为Rails假定它已经被加载了?(对此我不确定,但是这可能是在这里发生:https : //github.com/rails/rails/blob/master/activesupport/lib/active_support/dependencies.rb

我所要做的就是将我重命名matrix.rb为,matrix_ext.rb即使其中定义的类matrix_ext.rbMatrix这是我在问题中提到的解决方法,但我不知道为什么会这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章