Правильно ли я расширяю этот встроенный класс ruby? - PullRequest
1 голос
/ 31 января 2012

В моем приложении rails в lib / matrix.rb я ввел следующий код для расширения встроенного класса Matrix:

module Matrix

  require 'matrix'

  class Matrix
    def symmetric?
      return false if not square?
      (0 ... row_size).each do |i|
        (0 .. i).each do |j|
          return false if self[i,j] != self[j,i]
        end
      end
      true
    end

    def cholesky_factor
      raise ArgumentError, "must provide symmetric matrix" unless symmetric?
      l = Array.new(row_size) {Array.new(row_size, 0)}
      (0 ... row_size).each do |k|
        (0 ... row_size).each do |i|
          if i == k
            sum = (0 .. k-1).inject(0.0) {|sum, j| sum + l[k][j] ** 2}
            val = Math.sqrt(self[k,k] - sum)
            l[k][k] = val
          elsif i > k
            sum = (0 .. k-1).inject(0.0) {|sum, j| sum + l[i][j] * l[k][j]}
            val = (self[k,i] - sum) / l[k][k]
            l[i][k] = val
          end
        end
      end
      Matrix[*l]
    end
  end
end

Это правильный способ добавления методов в существующий класс в приложении rails? Должен ли я иметь строку Требуется матрица ?

РЕДАКТ. 1: Предоставлена ​​дополнительная информация

Я удалил обязательную строку 'matrix'.

Если я наберу следующий тестовый код на странице просмотра, будет работать, только если я удалю свой файл lib / matrix.rb :

<% require 'matrix' %>

<%

m = Matrix[
   [0,0],
   [1,1]
   ]

%>

<%= m.column(0) %>

В противном случае выдает ошибку:

undefined method `[]' for Matrix:Module

Похоже, что я удаляю стандартные методы встроенного класса Matrix, когда пытаюсь расширить класс. Есть ли способ обойти эту ошибку?

Ответы [ 2 ]

1 голос
/ 31 января 2012

нет, вам не нужно требовать «матрицу» здесь. Тот, кто использует ваш код (приложение rails в вашем случае), должен использовать require 'matrix'

0 голосов
/ 31 января 2012

Чтобы расширить базовый класс в Rails, вы просто открываете его, добавляете методы и закрываете его.Например, чтобы расширить класс Matrix:

class Matrix
  def my_method
    "New method"
  end
end

Вам также не нужно указывать require 'matrix' в своем коде.Пока файл, содержащий ваше расширение, находится в одном из путей автозагрузки, у вас должен быть прямой доступ к новым методам.

Если вам нужно добавить каталог в путь автозагрузки Rails, просто обновите /config/application.rbсо следующей строкой:

  • config.autoload_paths += %W(#{config.root}/app/extras) # Autoload /app/extras/*.rb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...