Qual è lo scopo dell'operatore del punto interrogativo in Ruby?
A volte appare così:
assert !product.valid?
a volte è in un ifcostrutto.
Qual è lo scopo dell'operatore del punto interrogativo in Ruby?
A volte appare così:
assert !product.valid?
a volte è in un ifcostrutto.
Risposte:
È una convenzione in stile codice; indica che un metodo restituisce un valore booleano.
Il punto interrogativo è un carattere valido alla fine del nome di un metodo.
?in Ruby (è un operatore ternario, che converte un carattere nel suo intero ASCII, utilizzo in test, in RegEx, ecc.) Molti dei quali sono trattati nelle altre risposte qui.
isEmpty(), isDigit()ecc In Ruby, gli stessi metodi avrebbe dovuto essere scritto empty?, e digit?che è piuttosto un po 'più bello IMO.
issempre. Questo potrebbe essere eccellente fonte di confusione per qualcuno proveniente da Swift in quanto il punto di domanda non è utilizzato per nullable:)
Nota anche ?insieme a un carattere, restituirà il codice di carattere ASCII perA
Per esempio:
?F # => will return 70
In alternativa in ruby 1.8 puoi fare:
"F"[0]
o in rubino 1.9:
"F".ord
Si noti inoltre che ?Frestituirà la stringa "F", quindi per ridurre il codice, è possibile utilizzare anche ?F.ordin Ruby 1.9 per ottenere lo stesso risultato "F".ord.
'F'
Nel tuo esempio fa solo parte del nome del metodo. In Ruby puoi anche usare i punti esclamativi nei nomi dei metodi!
Un altro esempio di punti interrogativi in Ruby sarebbe l'operatore ternario.
customerName == "Fred" ? "Hello Fred" : "Who are you?"
Nel tuo esempio
product.valid?
In realtà è una chiamata di funzione e chiama una funzione denominata valid?. Alcuni tipi di "test per condizione" / funzioni booleane hanno un punto interrogativo come parte del nome della funzione per convenzione.
Potrebbe valere la pena sottolineare che gli ?s sono consentiti solo nei nomi dei metodi, non nelle variabili. Nel processo di apprendimento di Ruby, ho ipotizzato che ?designasse un tipo di ritorno booleano, quindi ho provato ad aggiungerli alle variabili flag, causando errori. Ciò mi ha portato a credere erroneamente per un po 'che ci fosse una sintassi speciale che coinvolge? s.
Rilevante: perché un nome di variabile non può terminare con `?` Mentre un nome di metodo può?
Credo che sia solo una convenzione per le cose che sono booleane. Un po 'come dire " IsValid".
Viene anche usato nelle espressioni regolari, che significa "al massimo una ripetizione del carattere precedente"
ad esempio l'espressione regolare /hey?/ corrisponde alle stringhe " he" e " hey".
È anche una convenzione comune da usare con il primo argomento del metodo test da Kernel # test
irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true
come visto in questa domanda qui
test, ?dè una scorciatoia per "d". testaccetta una stringa di un carattere come primo argomento, quindi puoi chiamarla con test ?d, "/dev"o test "d", "/dev".