我希望使用此处显示的矩阵类:
http://rosettacode.org/wiki/Cholesky_decomposition#Ruby
在我的rails应用中。我已将该类复制到lib / matrix.rb
中在我的视图页面中,我尝试使用代码测试此类:
<%= Matrix[[25,15,-5],[15,18,0],[-5,0,11]].cholesky_factor %>
但是我收到错误消息:
undefined method `cholesky_factor' for Matrix[[25, 15, -5], [15, 18, 0], [-5, 0, 11]]:Matrix
我做错了吗? (我在lib / matrix.rb中也有'矩阵'行'
答案 0 :(得分:2)
从require 'matrix'
删除lib/matrix.rb
。
将重命名为lib/extend_matrix.rb
,以便我们专门加载。
在config/application.rb
:
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require 'matrix' # <-- moved here
#...bundler stuff...
module MyApp # <-- don't overwrite this!
class Application < Rails::Application
# ...
config.autoload_paths << "#{::Rails.root.to_s}/lib" # <-- set path
require "extend_matrix" # <-- forcibly load your matrix extension
# ...
注意#{::Rails.root.to_s}
。使用.to_s
至关重要,因为::Rails.root
会返回Pathname
个对象。没有它,您将添加/lib
(系统级别)到自动加载路径。我们想要/path/to/rails/lib
(应用程序级别)。
请记住重新启动服务器。
这就是我为它工作的方式。如果有人知道如何在没有静态要求的情况下执行此操作,请分享。我确信这可以动态完成。
答案 1 :(得分:0)
我认为问题在于从未读过lib / matrix.rb。如果您使用的是Rails 3,则dir目录中的文件不会自动加载。按照this answer中的建议,在application.rb中添加以下行并重新启动服务器:
config.autoload_paths += Dir["#{config.root}/lib/**/"] # include all subdirectories