Рубиновая матрица set_element приватная? - PullRequest
5 голосов
/ 24 июня 2011

При вызове set_element в экземпляре класса Matrix я получаю следующую ошибку

NoMethodError: private method ‘set_element’ called for Matrix[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]:Matrix

Но set_element указан в публичных методах экземпляров в документации

Matrix # set_element

Кроме того, set_element является псевдонимом для [] = (i, j, v) и, используя этот метод, я получаю следующую ошибку

ArgumentError: wrong number of arguments (3 for 2)

Не имеет никакого смысла, любая помощь приветствуется.

Рубин 1.9.2 p180

Ответы [ 2 ]

6 голосов
/ 24 января 2012

Вы можете просто сделать функции сеттера общедоступными, возможно, в своем собственном классе (или в самой матрице):

class SetableMatrix < Matrix
  public :"[]=", :set_element, :set_component
end
1 голос
/ 24 июня 2011

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

def []=(i, j, v)
  @rows[i][j] = v
end
alias set_element []=
alias set_component []=
private :[]=, :set_element, :set_component

Итак, есть три метода, но они явно установлены как приватные.

Немного быстрых экспериментов показывает, что многие методы в документации на самом деле являются частными. В верхней части справочной страницы находится большой блок документации, в котором перечислены доступные методы; этот список не совпадает со списком, сгенерированным rdoc, поэтому существует некоторая путаница.

У меня сложилось впечатление, что экземпляры Matrix должны быть неизменными, как Fixnum и Number.

...