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

Aus*_*son 2 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
Run Code Online (Sandbox Code Playgroud)

当此代码与使用它的代码包含在同一个类中时,一切运行正常.

当我将此代码移动lib/matrix.rb并要求它时,我收到以下错误:

./phylograph:30:in `block in run': private method `new' called for Matrix:Class (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

Aug*_*sto 6

这是因为Matrix是标准ruby库中的一个类,尝试为您的类提供不同的名称或将其放在模块中.


Dig*_*oss 6

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

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

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

更新:OIC,您无意使用标准库Matrix类.所以上面在技术上是你问题的原因,但对我来说只会说:

您的定义Matrix是与同名的Ruby Standard Library类冲突.

  • 所以你必须问自己:"什么是'矩阵'?" (4认同)