Ruby Class#new - 为什么`new`是一个私有方法?

时间:2011-03-21 16:34:31

标签: ruby matrix access-specifier

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

3 个答案:

答案 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库的其他代码可以看到其他文件,那么问题会更严重!