A volte vedo metodi in Ruby che hanno "?" e "!" alla fine di essi, ad esempio:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Mi chiedevo qual è il loro scopo? Sono solo un rivestimento di zucchero di sintassi?
A volte vedo metodi in Ruby che hanno "?" e "!" alla fine di essi, ad esempio:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Mi chiedevo qual è il loro scopo? Sono solo un rivestimento di zucchero di sintassi?
Risposte:
È "solo rivestimento di zucchero" per la leggibilità, ma hanno significati comuni:
!
esecuzione di modifiche permanenti o potenzialmente pericolose ; per esempio:
Enumerable#sort
restituisce una versione ordinata dell'oggetto mentre lo Enumerable#sort!
ordina in posizione.ActiveRecord::Base#save
restituisce false se il salvataggio non è riuscito, mentre ActiveRecord::Base#save!
solleva un'eccezione.Kernel::exit
fa sì che uno script esca, mentre lo Kernel::exit!
fa immediatamente, bypassando qualsiasi gestore di uscita.?
un valore booleano , che rende il flusso di codice ancora più intuitivo come una frase: si if number.zero?
legge come "se il numero è zero", ma if number.zero
sembra strano.Nel tuo esempio, name.reverse
restituisce una stringa invertita, ma solo dopo la name.reverse!
riga la name
variabile contiene effettivamente il nome invertito. name.is_binary_data?
sembra "sono name
dati binari?".
Array#clear
, per esempio. Cancella l'array. La cancellazione dell'array lo modifica naturalmente. Non c'è niente di sorprendente in questo, già il nome lo dice chiaramente, quindi: niente botto. Vedi ruby-forum.com/topic/176830#773946 .
Il punto interrogativo indica che il metodo restituisce booleano. Già risposto qui:
Cosa significa l'operatore punto interrogativo in Ruby?
Il botto indica che il metodo agisce sull'oggetto stesso. Già risposto qui:
Perché i punti esclamativi vengono utilizzati nei metodi Ruby?
In Ruby ?
significa che il metodo restituirà un booleano e !
modificherà l'oggetto su cui è stato chiamato. Sono lì per migliorare la leggibilità quando si guarda il codice.
In contrasto con - suppongo - la maggior parte dei linguaggi di programmazione ...
Ruby, i metodi possono terminare con punti interrogativi o punti esclamativi.
Per convenzione, i metodi che rispondono alle domande (ad esempio Array # empty? Restituisce true se il ricevitore è vuoto) terminano con punti interrogativi.
I metodi potenzialmente "pericolosi" (cioè i metodi che modificano se stessi o gli argomenti, escono! Ecc.) Per convenzione terminano con punti esclamativi.
Da: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , sezione Nomi metodi divertenti
?
sono chiamati metodi predicato.
Attenzione, non è sempre così. Prendiamo ad esempio Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .
Dove puoi bruciarti gravemente è qualcosa di simile MyActiveRecordModel.column_names.concat([url])
. Le chiamate successive relative a MyActiveRecordModel proveranno a cercare una colonna di "url" per MyActiveRecordModel e lanciano.
Invece devi clonarlo prima di eseguire il concat. Fortunatamente la mia suite di test ha rilevato questo, ma .. avvertite!