【问题标题】:Ruby Class#new - Why is `new` a private method?Ruby Class#new - 为什么`new` 是私有方法?
【发布时间】:2011-03-21 16:34:30
【问题描述】:

我创建了一个 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)

【问题讨论】:

  • 我们能看到最终的matrix.rb 文件吗?这个特定的代码块似乎没有任何效果。

标签: ruby matrix access-specifier


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 天啊!就在我开始享受 Ruby 开放课程的能力时,它让我很痛苦。
  • 所以你必须问自己:“Matrix 是什么?”
【解决方案2】:

这是因为Matrix is a class from the standard ruby library,请尝试给你的类起一个不同的名字,或者把它放在一个模块中。

【讨论】:

    【解决方案3】:

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

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

    这就是为什么在编写库时,建议您使用only make one file visible to other code。想象一下,如果matrix 库中的其他文件对其他代码可见,那么问题会变得多么糟糕!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      相关资源
      最近更新 更多