Domanda

In Ruby alcuni metodi hanno un punto interrogativo (? ) che pone una domanda come include? che chiede se l'oggetto in questione è incluso, questo quindi restituisce un vero / falso.

Ma perché alcuni metodi hanno punti esclamativi (! ) dove altri no?

Cosa significa?

È stato utile?

Soluzione

In generale, i metodi che terminano con ! indicano che il metodo modificherà l'oggetto su cui è stato chiamato . Ruby li chiama come " metodi pericolosi " perché cambiano stato a cui qualcun altro potrebbe fare riferimento. Ecco un semplice esempio di stringhe:

foo = "A STRING"  # a string called foo
foo.downcase!     # modifies foo itself
puts foo          # prints modified foo

Questo produrrà:

a string

Nelle librerie standard, ci sono molti posti in cui vedrai coppie di metodi con nomi simili, uno con il ! e uno senza. Quelli senza sono chiamati "metodi sicuri", e restituiscono una copia dell'originale con le modifiche applicate a la copia , con il nome invariato. Ecco lo stesso esempio senza ! :

foo = "A STRING"    # a string called foo
bar = foo.downcase  # doesn't modify foo; returns a modified string
puts foo            # prints unchanged foo
puts bar            # prints newly created bar

Questo output:

A STRING
a string

Tieni presente che questa è solo una convenzione, ma molte classi di Ruby la seguono. Ti aiuta anche a tenere traccia di ciò che viene modificato nel tuo codice.

Altri suggerimenti

Il punto esclamativo significa molte cose, e talvolta non si può dire molto da esso oltre a "questo è pericoloso, fai attenzione".

Come altri hanno già detto, nei metodi standard è spesso usato per indicare un metodo che fa mutare un oggetto, ma non sempre. Nota che molti metodi standard cambiano il loro ricevitore e non hanno un punto esclamativo ( pop , shift , clear ) e alcuni metodi con esclamativo i punti non cambiano il loro ricevitore ( exit! ). Vedi questo articolo per esempio.

Altre librerie potrebbero usarlo in modo diverso. In Rails un punto esclamativo spesso significa che il metodo genererà un'eccezione in caso di fallimento anziché fallire silenziosamente.

È una convenzione di denominazione, ma molte persone la usano in modi leggermente diversi. Nel tuo codice una buona regola del pollice è usarlo ogni volta che un metodo sta facendo qualcosa di "pericoloso", specialmente quando esistono due metodi con lo stesso nome e uno di essi è più "pericoloso". rispetto all'altro. & Quot; Dangerous " può significare quasi tutto però.

Questa convenzione di denominazione è stata sollevata da Schema .

  

1.3.5 Convenzioni di denominazione

     

Per convenzione, i nomi delle procedure   che restituisce sempre un valore booleano   di solito termina in ``? ''. Tali procedure   sono chiamati predicati.

     

Per convenzione, i nomi delle procedure   che memorizzano i valori in precedenza   posizioni allocate (vedere sezione 3.4)   di solito termina in ``! ''. Tali procedure   sono chiamate procedure di mutazione. Di   convenzione, il valore restituito da a   la procedura di mutazione non è specificata.

! in genere significa che il metodo agisce sull'oggetto anziché restituire un risultato. Dal libro Programmazione di Ruby :

  

Metodi che sono "pericolosi", o modificare il ricevitore, potrebbe essere chiamato con un trascinamento "! " ;.

Da themomorohoax.com:

Un botto può essere utilizzato nei modi seguenti, in base alle mie preferenze personali.

  

1) Un metodo di registrazione attivo genera un errore se il metodo non funziona   quello che dice che lo farà.

     

2) Un metodo di registrazione attivo salva il record o un metodo salva un   oggetto (ad es. striscia!)

     

3) Un metodo fa qualcosa & # 8220; extra & # 8221 ;, come post in qualche posto, o fa   qualche azione.

Il punto è: usa il botto solo quando hai davvero pensato a se è necessario, per salvare gli altri sviluppatori il fastidio di doverlo fare controlla perché stai usando il botto.

Il botto fornisce due spunti ad altri sviluppatori.

  

1) che non è necessario salvare l'oggetto dopo aver chiamato il   metodo.

     

2) quando si chiama il metodo, il db verrà modificato.

http: // www .themomorohoax.com / 2009/02/11 / quando-per-use-a-bang-punto esclamativo-dopo-rotaie-methods

È più preciso affermare che i metodi con un botto! sono i pericolosi o sorprendente versione. Esistono molti metodi che mutano senza un botto come < code> .destroy e in generale i metodi hanno il botto solo dove esiste un'alternativa più sicura nella libreria di base.

Ad esempio, su Array abbiamo .compact e .compact! , entrambi i metodi mutano l'array, ma .compact! restituisce zero invece di sé se non ci sono zero nell'array, il che è più sorprendente del semplice ritorno di sé.

L'unico metodo non mutante che ho trovato con il botto è Kernel s .exit! che è più sorprendente di .exit perché non puoi catturare < code> SystemExit mentre il processo sta chiudendo.

Rails e ActiveRecord continuano questa tendenza in quanto utilizza il botto per effetti più "sorprendenti" come .create! che genera errori in caso di fallimento.

Spiegazione semplice:

foo = "BEST DAY EVER" #assign a string to variable foo.

=> foo.downcase #call method downcase, this is without any exclamation.

"best day ever"  #returns the result in downcase, but no change in value of foo.

=> foo #call the variable foo now.

"BEST DAY EVER" #variable is unchanged.

=> foo.downcase! #call destructive version.

=> foo #call the variable foo now.

"best day ever" #variable has been mutated in place.

Ma se hai mai chiamato un metodo downcase! nella spiegazione sopra, foo cambierebbe in downcase in modo permanente. downcase! non restituisce un nuovo oggetto stringa ma sostituisce la stringa in posizione, cambiando totalmente il foo in downcase. Ti suggerisco di non usare downcase! a meno che non sia del tutto necessario.

!

Mi piace pensare a questo come a un cambiamento esplosivo che distrugge tutto ciò che è accaduto prima. Bang o punto esclamativo significa che stai apportando una modifica permanente salvata nel tuo codice.

Se ad esempio usi il metodo di Ruby per la sostituzione globale gsub! la sostituzione che fai è permanente.

Un altro modo in cui puoi immaginarlo è aprire un file di testo e fare ricerca e sostituzione, seguito dal salvataggio. ! fa lo stesso nel tuo codice.

Un altro utile promemoria se vieni dal mondo bash è sed -i ha questo effetto simile di apportare modifiche permanenti salvate.

Chiamato " Metodi distruttivi " Tendono a cambiare la copia originale dell'oggetto a cui ti riferisci.

numbers=[1,0,10,5,8]
numbers.collect{|n| puts n*2} # would multiply each number by two
numbers #returns the same original copy
numbers.collect!{|n| puts n*2} # would multiply each number by two and destructs the original copy from the array
numbers   # returns [nil,nil,nil,nil,nil]

Linea di fondo: i metodi ! cambiano semplicemente il valore dell'oggetto su cui sono chiamati, mentre un metodo senza ! restituisce un valore manipolato senza scrivere sull'oggetto il metodo è stato invitato.

Usa ! solo se non prevedi di aver bisogno del valore originale memorizzato nella variabile su cui hai chiamato il metodo.

Preferisco fare qualcosa del tipo:

foo = "word"
bar = foo.capitalize
puts bar

o

foo = "word"
puts foo.capitalize

Invece di

foo = "word"
foo.capitalize!
puts foo

Nel caso in cui vorrei accedere nuovamente al valore originale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top