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てrequireすると、次のエラーが発生します。

./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

に移動したときにのみバグがあなたを噛んだ理由については、次のとおりですlib/matrix.rb

移動する前はrequire 'matrix'コードになかったので、マトリックス標準ライブラリをロードしませんでした。しかし、それを移動require 'matrix'してコードに追加すると、マトリックス標準ライブラリがロードされます。

これが、ライブラリを作成するときに、1 つのファイルのみを他のコードから見えるようにすることをお勧めする理由です。matrixライブラリに他のコードから見える他のファイルがあった場合、問題がどれほど悪化するか想像してみてください!

于 2011-03-21T22:24:14.523 に答える