2012-08-12 22 views
5

Estoy tratando de obtener un buen estilo de codificación de Ruby. Para evitar llamar accidentalmente a una variable local con el mismo nombre, siempre estoy usando self. cuando corresponda. Pero ahora me tropecé con esto:Llamar a un método privado xxx usando self.xxx() desde otro método privado que da como resultado el error "método privado` xxx 'llamado "

class MyClass < ActiveRecord::Base 
    before_validation :sanitize_user_data 

    private 

    def sanitize_user_data 
    self.sanitize_name # with ".self" it's a problem, without it's not! 
    end 

    def sanitize_name 
    unless self.name.nil? 
     self.name.gsub!(/\s+/, ' ') 
     self.name.strip! 
    end 
    end 
end 

Los resultados de código anterior en un error

método privado llamado sanitize_name

pero al retirar self. y simplemente usando sanitize_name, funciona. ¿Porque eso?

Respuesta

8

Esto sucede porque los métodos privados no pueden ser llamados con un receptor explícito, y diciendo self.sanitize_name es especificar explícitamente el objeto (self) que debe recibir sanitize_name, en lugar de confiar en el receptor implícita (que también es self).

No puede evitar esto, ya sea que necesite llamar al antiguo sanitize_name sin un receptor explícito, o hacer self.send(:sanitize_name). No estoy seguro de que especificar explícitamente siempre self sea realmente un "buen estilo", pero eso es subjetivo. Si desea asegurarse de que está llamando a un método en lugar de una variable, agregue paréntesis:

def a; "method"; end 
a = "variable" 
a() #=> "method" 
a #=> "variable" 
+0

Gracias por la explicación. Tendré esto en cuenta, pero supongo que para entenderlo realmente, tendría que profundizar en los aspectos internos de Ruby, ¿verdad? –

+3

@JoshuaMuheim No necesariamente, es solo la forma en que funcionan los métodos privados, al prohibir un receptor explícito no se puede llamar desde cualquier lugar donde el receptor implícito no es el mismo 'yo', simplemente tiene el efecto secundario desafortunado de impedirte llamando a un método privado con el mismo receptor explícito que el receptor implícito. –

+0

Bien, eso es interesante. Muchas gracias por explicarme. :) –

2

¿Por qué?

Por definición. Los métodos privados solo pueden invocarse mediante un envío de mensaje sin receptor, esa es la definición de lo que significa private.

+0

+1 Corto y dulce. –

Cuestiones relacionadas