2009-08-28 19 views
156

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

A volte appare come questa:

assert !product.valid? 

a volte è in una if costrutto.

+0

punto interrogativo alla fine di una funzione non è un operatore, è un carattere normale. Il punto interrogativo insieme ai due punti è un operatore condizionale ternario. Il punto interrogativo di per sé è un operatore di quotazione unario. Vedi http://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do –

risposta

215

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

+4

Grazie, ma questa convenzione significa che fa solo il _logic_ o potrebbero esserci effetti collaterali? Strano come questa sia una sorta di hack su una lingua tipizzata con il tipo restituito nel codice. – Jason

+1

In questo caso si tratta di una convenzione di denominazione del metodo. Non esiste l'applicazione di un valore di ritorno booleano. Solo perché il nome del metodo termina con un punto interrogativo non significa che il metodo * deve * restituire un valore booleano ... ma sicuramente * dovrebbe * restituire un valore booleano. Tuttavia ci sono molti altri usi del '?' In Ruby (è un operatore ternario, converte un carattere nel suo intero ASCII, l'uso in 'test', in RegEx'es, ecc.) Molti dei quali sono trattati nelle altre risposte Qui. –

+2

@Jason FYI, anche le lingue fortemente tipizzate hanno convenzioni come questa. Ad esempio, in Java i metodi che restituiscono un valore booleano sono spesso preceduti da "is", come in 'isEmpty()', 'isDigit()', ecc. In Ruby, gli stessi metodi dovrebbero essere scritti 'empty?', E "digit?" che è un po 'più bello IMO. – Ajedi32

35

È una convenzione in Ruby che i metodi che restituiscono valori booleani terminano con un punto interrogativo. Non c'è più significato per questo.

5

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

+0

commento conciso e fantastico specialmente" Un po 'come dire "IsValid" –

14

Nel tuo esempio

product.valid? 

è in realtà una chiamata di funzione e chiede una funzione denominata valid?. Alcuni tipi di funzioni "test per condizione"/booleana hanno un punto interrogativo come parte del nome della funzione per convenzione.

+37

answer.gsub! (/ Function /,' metodo ' –

+0

Buon commento ... lolz –

21

Nel tuo esempio è solo una 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?" 
+11

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

1

E 'anche usato nelle espressioni regolari, che significa "al massimo una ripetizione del carattere precedente"

ad esempio l'espressione regolare /hey?/ corrispondenze con le stringhe "he" e "hey".

69

noti inoltre ? insieme a un personaggio, restituirà il codice di carattere ASCII per A

Ad esempio:

?F # => will return 70 

alternativa in Ruby 1.8 si può fare:

"F"[0] 

o in ruby ​​1.9:

"F".ord 

Si noti inoltre che ?F restituirà la stringa "F", quindi per rendere il codice più breve, è inoltre possibile utilizzare ?F.ord in Ruby 1.9 per ottenere lo stesso risultato di "F".ord.

+2

Interessante, grazie – rtacconi

+25

In ruby ​​1.9 restituirà ''F'' – klew

+2

Solo il dettaglio che stavo cercando –

0

E 'anche una convenzione comune da utilizzare 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 
+2

Non è correlato a' test', '? d' è una scorciatoia per' "d" '.' test' prende come primo argomento una stringa di un carattere, quindi puoi chiamarla con 'test? d,"/dev "' o 'test" d ","/dev "'. – bfontaine

10

Può valere la pena sottolineare che? S sono ammessi solo nei nomi dei metodi, non variabili.Nel processo di apprendimento di Ruby, l'ho assunto? designato un tipo di ritorno booleano, quindi ho provato ad aggiungerli alle variabili flag, causando errori. Questo mi ha portato erroneamente a credere per un po 'che ci fosse qualche sintassi speciale che coinvolge?

Rilevante: Why can't a variable name end with `?` while a method name can?

Problemi correlati