Ruby Matrix set_element частный?

При вызове 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


person Ram    schedule 24.06.2011    source источник
comment
Вы не первый, кто удивлен Matrix: stackoverflow.com/questions/6064902/ . Я не знаю, поможет ли вам этот вопрос.   -  person Andrew Grimm    schedule 24.06.2011
comment
См. также stackoverflow.com/questions/7214367/   -  person Marc-André Lafortune    schedule 10.09.2011


Ответы (2)


Документация неверна. Если вы посмотрите на файл 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.

person mu is too short    schedule 24.06.2011
comment
Здесь есть обсуждение этой темы ruby-forum.com/topic/161792 - person Ram; 24.06.2011
comment
@Ram: Но я не вижу никакого оправдания неизменности Матрицы. Мне кажется излишне громоздким. Я полагаю, вы могли бы просто скопировать matrix.rb и удалить private материал, он выглядит как простой массив массивов внутри. - person mu is too short; 24.06.2011

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

class SetableMatrix < Matrix
  public :"[]=", :set_element, :set_component
end
person theldoria    schedule 24.01.2012