2009-12-09 14 views

risposta

13

Utilizzando self.salt = verrà utilizzato il metodo salt=, se definito. Ciò è utile per garantire che vengano utilizzati controlli/trasformazioni degli errori all'interno del metodo salt=. Tuttavia, significa che deve esistere un metodo esplicito salt= (probabilmente creato da attr_accessor, ad esempio) e questa non è necessariamente una buona idea.

Riepilogo: utilizzare self.salt = se si dispone di un metodo personalizzato salt=; utilizzare @salt = se si sa esattamente cosa si desidera che sia @salt o se non si dispone di un metodo personalizzato salt=.

Nota finale: probabilmente sarei scrivo come questo (a mio parere è un po 'più chiaro)

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

EDIT: grazie a @ commenti di Chuck su un'altra risposta, ho modificato questo per rimuovere il self. - codice gratuito - era sbagliato.

+0

Grazie mille Peter! Sono d'accordo, mi piace la tua versione migliore. – Kevin

4

Oltre all'ottima risposta di Peter, di solito in Ruby viene segnalato che sto utilizzando attr_accessor utilizzando self.attr = e self.attr anziché @attr.

Modifica: senza "self.", Si sta creando una variabile locale. Yikes.

+0

sì, questi sono buoni punti ... – Peter

+2

Infatti, scrivendo semplicemente 'sale = 5' senza specificare' self' come il ricevitore * creerà una variabile locale. – Chuck

+0

@Chuck, questo è un punto molto importante che non avevo realizzato. Ho modificato la mia risposta. – Peter

2

seguito alla risposta di Pietro:

Un altro punto interessante è che self.salt= può essere invocata anche se il sale = metodo è privato. Questa è un'eccezione alla normale regola Ruby che un metodo privato non può essere invocato con un ricevitore esplicito.

Problemi correlati