Qual è lo scopo dell'operatore del punto interrogativo in Ruby?
A volte appare così:
assert !product.valid?
a volte è in un if
costrutto.
Qual è lo scopo dell'operatore del punto interrogativo in Ruby?
A volte appare così:
assert !product.valid?
a volte è in un if
costrutto.
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.
is
sempre. 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 ?F
restituirà la stringa "F"
, quindi per ridurre il codice, è possibile utilizzare anche ?F.ord
in 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"
. test
accetta una stringa di un carattere come primo argomento, quindi puoi chiamarla con test ?d, "/dev"
o test "d", "/dev"
.