2009-12-09 21 views

Respuesta

13

El uso del self.salt = hará que se use el método salt=, si está definido. Esto es útil para garantizar que se utilicen las comprobaciones/transformaciones de errores dentro del método salt=. Sin embargo, significa que debe haber un método explícito salt= (posiblemente creado por attr_accessor, por ejemplo), y esto no es necesariamente una buena idea.

Resumen: use self.salt = si tiene un método personalizado salt=; use @salt = si sabe exactamente lo que quiere que sea @salt, o si no tiene un método personalizado salt=.

Nota final: Probablemente lo escribo como esto (en mi opinión es un poco más claro)

def create_new_salt 
    @salt = "#{object_id}#{rand}" 
end 

Edit: Gracias a @ comentarios de Chuck en otra respuesta, he modificado esta opción para eliminar la self.-código libre: estaba mal.

+0

Muchas gracias Peter! Estoy de acuerdo, me gusta mejor tu versión. – Kevin

4

Además de la gran respuesta de Peter, normalmente señalo en Ruby que estoy usando attr_accessor usando self.attr = y self.attr en lugar de @attr.

Editar: Sin "auto.", Está creando una variable local. Yikes.

+0

sí, estos son buenos puntos ... – Peter

+2

De hecho, simplemente escribiendo 'salt = 5' sin especificar' self' ya que el receptor * creará * una variable local. – Chuck

+0

@Chuck, este es un punto muy importante del que no me había dado cuenta. He modificado mi respuesta. – Peter

2

con la respuesta de Pedro:

Otro punto interesante es que se puede invocar self.salt= incluso si la sal = método es privado. Esta es una excepción a la regla Ruby normal de que un método privado no puede invocarse con un receptor explícito.

Cuestiones relacionadas