2011-06-24 25 views
5

Al llamar set_element en una instancia de la clase Matrix me sale el siguiente errorRuby 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 

Pero set_element aparece bajo los métodos de instancia públicas en la documentación

Matrix#set_element

Además, set_element es un alias para []=(i, j, v) y usando este método me sale el siguiente error

ArgumentError: wrong number of arguments (3 for 2) 

No tiene sentido, se agradece cualquier ayuda.

Ruby 1.9.2 p180

+0

No eres la primera persona sorprendido por Matrix: http://stackoverflow.com/ preguntas/6064902/copy-inheritance-of-a-ruby-singleton-class-core-std-lib. No sé si esa pregunta te ayudará. –

+0

Vea también http://stackoverflow.com/questions/7214367/using-ruby-1-9-2-with-rubymine-and-matrix –

Respuesta

1

La documentación es incorrecta. Si nos fijamos en el archivo de matrix.rb 1.9.1, verá esto:

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

Así que los tres métodos son allí, pero que se establecen explícitamente como privado.

Un poco de experimentación rápida indica que muchos de los métodos en la documentación son, de hecho, privados. Hay un gran bloque de documentación en la parte superior de la página de manual que enumera los métodos disponibles, aparentemente, supuestamente; esa lista no coincide con la lista que rdoc ha generado, por lo que hay cierta confusión.

Tengo la impresión de que las instancias de Matrix están destinadas a ser inmutables al igual que Fixnum y Number.

+0

Hay un poco de discusión sobre este tema aquí http: //www.ruby- forum.com/topic/161792 – Ram

+0

@Ram: Pero no veo ninguna justificación para la inmutabilidad de Matrix. Me parece innecesariamente engorroso. Supongo que podrías copiar 'matrix.rb' y eliminar las cosas' privadas', parece una simple matriz de matrices internamente. –

6

Simplemente puede hacer las funciones setter pública, posiblemente en su propia clase (o por propia matriz):

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