在铁轨之外,我有以下内容:
|- 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.rb
是Matrix
。这是我在问题中提到的解决方法,但我不知道为什么会这样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句