Cosa significa l'operatore del punto interrogativo in Ruby?


211

Qual è lo scopo dell'operatore del punto interrogativo in Ruby?

A volte appare così:

assert !product.valid?

a volte è in un ifcostrutto.


2
Il punto interrogativo alla fine di una funzione non è un operatore, è un carattere ordinario. Il punto interrogativo insieme ai due punti è un operatore condizionale ternario. Il punto interrogativo di per sé è un operatore di quotazione unario. Vedi stackoverflow.com/questions/16641205/…
Old Pro

Risposte:


296

È 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.


9
Grazie, ma questa convenzione significa solo la logica o potrebbero esserci effetti collaterali? Divertente come questo sia una specie di hack in una lingua digitata con il tipo restituito nel codice.
Jason,

5
In questo caso è strettamente una convenzione di denominazione del metodo. Non è possibile applicare un valore di ritorno booleano. Solo perché il nome del metodo termina in un punto interrogativo non significa che il metodo debba restituire un valore booleano ... ma sicuramente dovrebbe restituire un valore booleano. Tuttavia ci sono molti altri usi di ?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.
Karl Wilbur,

4
@Jason FYI, anche i linguaggi fortemente tipizzati hanno convenzioni come questa. Per esempio, in metodi Java che restituiscono un valore booleano sono spesso il prefisso "è", come in isEmpty(), isDigit()ecc In Ruby, gli stessi metodi avrebbe dovuto essere scritto empty?, e digit?che è piuttosto un po 'più bello IMO.
Ajedi32,

3
Ajedi32 - Sì, sono d'accordo, è bello nominare funzioni del genere, le uso issempre. Questo potrebbe essere eccellente fonte di confusione per qualcuno proveniente da Swift in quanto il punto di domanda non è utilizzato per nullable:)
Jason

83

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.


29
In ruby ​​1.9 tornerà'F'
klew

39

È una convenzione in Ruby che i metodi che restituiscono valori booleani finiscono in un punto interrogativo. Non c'è più significato ad esso di quello.


28

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?"

13
Per espandere la risposta di Andy vedrai anche cose come: customerName == user.logged_in? ? user.name: "Chi sei?" Nota il doppio punto
interrogativo

16

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.


41
answer.gsub! (/ function /, 'method')
glenn jackman,

15

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ò?


9

Credo che sia solo una convenzione per le cose che sono booleane. Un po 'come dire " IsValid".


1
commento conciso e fantastico specialmente "Un po 'come dire" IsValid "
Kick Buttowski

2

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".


0

È 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


3
Non è collegato a 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".
bfontaine,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.