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#sortrestituisce una versione ordinata dell'oggetto mentre lo Enumerable#sort!ordina in posizione.ActiveRecord::Base#saverestituisce false se il salvataggio non è riuscito, mentre ActiveRecord::Base#save!solleva un'eccezione.Kernel::exitfa 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.zerosembra strano.Nel tuo esempio, name.reverserestituisce una stringa invertita, ma solo dopo la name.reverse!riga la namevariabile contiene effettivamente il nome invertito. name.is_binary_data?sembra "sono namedati 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!