Ruby Class # new - Почему `new` закрытый метод? - PullRequest
1 голос
/ 21 марта 2011

Я создал класс 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 ]

6 голосов
/ 21 марта 2011

Это потому, что Matrix - это класс из стандартной библиотеки ruby ​​, попробуйте дать другому классу другое имя или поместите его в модуль.

5 голосов
/ 21 марта 2011

Насколько я помню, Matrix - это чисто функциональный класс; его объекты неизменны, и простое создание нового объекта Matrix обычно бесполезно, так как API не имеет никаких изменяемых операций.

Итак, новые Matrix объекты создаются API, который просто не использует new на уровне пользователя.

Это дизайнерское решение, принятое автором.

Обновление: OIC, вы не собирались использовать стандартный класс библиотеки Matrix. Таким образом, вышесказанное является технической причиной вашей проблемы, но для меня было бы более полезно просто сказать:

Ваше определение Matrix противоречит стандарту Ruby Библиотечный класс с одноименным названием.

1 голос
/ 22 марта 2011

А почему ошибка вас укусила только тогда, когда вы переместили ее на lib/matrix.rb:

До того, как вы его переместили, в вашем коде не было require 'matrix', поэтому вы не загрузили матричную стандартную библиотеку. Но когда вы переместили его и добавили require 'matrix' в свой код, вы загрузили стандартную матричную библиотеку.

Именно поэтому при написании библиотек рекомендуется сделать только один файл видимым для другого кода . Представьте себе, насколько хуже будет проблема, если в библиотеке matrix будут другие файлы, видимые для другого кода!

...