2

我制作了一个 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)
4

3 回答 3

6

这是因为Matrix 是标准 ruby​​ 库中的一个类,试着给你的类一个不同的名字或者把它放在一个模块中。

于 2011-03-21T16:38:24.970 回答
6

我记得, Matrix是一个纯粹的功能类;它的对象是不可变的,简单地创建一个新Matrix对象通常是没有用的,因为 API 没有任何可变操作。

因此,新对象是由一个在用户级别Matrix不使用的 API 创建的。new

这是作者做出的设计决定。

更新:OIC,您无意使用标准库 Matrix 类。因此,从技术上讲,以上是您问题的原因,但对我来说只是说:

您的定义Matrix与同名的 Ruby 标准库类冲突。

于 2011-03-21T16:39:42.103 回答
1

至于为什么这个 bug 只在你移动到时才会咬你lib/matrix.rb

在你移动它之前,你require 'matrix'的代码中没有,所以你没有加载矩阵标准库。但是当你移动它并添加require 'matrix'到你的代码中时,你加载了矩阵标准库。

这就是为什么在编写库时,建议您只让一个文件对其他代码可见matrix想象一下,如果库中的其他文件对其他代码可见,问题会变得多么糟糕!

于 2011-03-21T22:24:14.523 回答