【发布时间】:2014-11-03 10:28:28
【问题描述】:
在rails之外,我有以下内容:
|- 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 和我的。有什么建议吗?
ps:我使用的是 ruby 2.1.4p265 和 Rails 4.1.6
【问题讨论】:
-
尝试添加 require 'matrix.rb'
-
感谢您的建议,@Hemali。还是一样。我认为 require 认为 'matrix' 已经加载,因为它与我的 lib/matrix 同名。
-
理想情况下,我会选择命名空间解决方案。喜欢
myproject/matrix以避免这样的名称冲突。除非您故意扩展核心类。如果您有意扩展核心类,我通常会在初始化程序中(在 rails 中)这样做。 -
您应该将自定义类名更改为其他名称,而不是
Matrix。 -
我实际上是在修补核心 class=)
标签: ruby-on-rails ruby