2011-06-24 21 views
5

Dzwoniąc set_element na wystąpienie klasy Matrix I pojawia się następujący błądRuby Matrix set_element private?

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

Ale set_element znajduje się na liście metod instancji publicznej w dokumentacji

Matrix#set_element

Również set_element jest aliasem dla []=(i, j, v) i przy użyciu tej metody pojawia się następujący błąd:

ArgumentError: wrong number of arguments (3 for 2) 

Nie ma sensu, każda pomoc jest doceniana.

Rubin 1.9.2 p180

+0

Nie jesteś pierwszą osobą zaskoczony Matrix: http://stackoverflow.com/ pytania/6064902/copy-inheritance-of-a-ruby-singleton-class-core-std-lib. Nie wiem, czy to pytanie ci pomoże. –

+0

Zobacz także http://stackoverflow.com/questions/7214367/using-ruby-1-9-2-with-rubymine-and-matrix –

Odpowiedz

1

Dokumentacja jest niepoprawna. Jeśli spojrzeć na pliku z 1.9.1 matrix.rb, zobaczysz to:

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

Więc trzy metody są tam, ale są one jawnie ustawione jako prywatne.

Trochę szybkich eksperymentów wskazuje, że wiele metod w dokumentacji jest w rzeczywistości prywatnych. Na górze strony podręcznika znajduje się duży blok dokumentacji, w którym wymieniono najprawdopodobniej dostępne metody; ta lista nie pasuje do listy wygenerowanej przez rdoc, więc jest pewne zamieszanie.

Mam wrażenie, że instancje Matrixa mają być niezmienne, podobnie jak Fixnum i Number.

+0

Istnieje pewna dyskusja na ten temat tutaj http: //www.ruby- forum.com/topic/161792 – Ram

+0

@Ram: Ale nie widzę żadnego uzasadnienia dla niezmienności Matrixa. Wydaje mi się niepotrzebnie kłopotliwy. Przypuszczam, że po prostu skopiowałbyś 'matrix.rb' i usunąłby element' private', który wygląda jak prosta tablica tablic wewnątrz. –

6

Można po prostu zrobić funkcje setter publicznych, ewentualnie w swojej własnej klasy (lub na samej matrycy):

class SetableMatrix < Matrix 
    public :"[]=", :set_element, :set_component 
end