我制作了一个Matrix类,我想在代码的各个部分使用它。
class Matrix
def initialize(x, y, v=0)
@matrix = Array.new
(0..y).each do |j|
@matrix[j] = Array.new
(0..x).each do |i|
@matrix[j][i] = v
end
end
end
end
当此代码与使用它的代码包含在同一个类中时,一切运行正常。
当我将此代码移至lib/matrix.rb
并要求时,我收到以下错误:
./phylograph:30:in `block in run': private method `new' called for Matrix:Class (NoMethodError)
答案 0 :(得分:6)
这是因为Matrix is a class from the standard ruby library,请尝试为您的班级提供不同的名称或将其放在模块中。
答案 1 :(得分:5)
我记得,Matrix
是一个纯粹的functional类;它的对象是不可变的,简单地创建一个新的Matrix
对象通常是无用的,因为API没有任何可变操作。
因此,新的Matrix
对象是由API创建的,该API在用户级别不使用new
。
这是作者做出的一项设计决定。
更新:OIC,您无意使用标准库Matrix类。所以上面在技术上是你问题的原因,但对我来说只会说:
会更有帮助您对
Matrix
的定义与Ruby Standard发生冲突 同名的库类。
答案 2 :(得分:1)
至于为什么当你把它移到lib/matrix.rb
时,这个bug只会让你感到沮丧:
在移动它之前,代码中没有require 'matrix'
,因此您没有加载矩阵标准库。但是当你移动它并在代码中添加require 'matrix'
时,就加载了矩阵标准库。
这就是为什么在编写库时,建议您only make one file visible to other code。想象一下,如果matrix
库的其他代码可以看到其他文件,那么问题会更严重!