2009-10-23 16 views
6

Sto imparando Ruby e trovato questo esempio di codice in qualche documentazione:Che cosa significa la sintassi? significa in questo esempio di Ruby?

require 'find' 

    total_size = 0 

    Find.find(ENV["HOME"]) do |path| 
    if FileTest.directory?(path) 
     if File.basename(path)[0] == ?. 
     Find.prune  # Don't look any further into this directory. 
     else 
     next 
     end 
    else 
     total_size += FileTest.size(path) 
    end 
    end 

Lo scopo è quello di riassumere le dimensioni dei file di tutti i file in un albero, escludendo le directory che iniziano con un punto. La linea if File.basename(path)[0] == ?. sta ovviamente eseguendo il test del nome della directory. Avrei scritto così:

if File.basename(path)[0] == "." 

Cosa ?. fare? (Potrebbe essere un refuso, suppongo.) Non ho visto questa sintassi descritta altrove.

risposta

11

?. restituisce il valore ASCII del punto. Puoi inserire praticamente qualsiasi carattere dopo il punto interrogativo per ottenere il suo valore ASCII, come ?a o ?3 o ?\\, ecc. Il motivo per cui non lo confrontano con la stringa "." è che quando si esegue l'indicizzazione in una stringa, si ottiene l'ASCII valore del char a quell'indice piuttosto che il char stesso. Per ottenere il carattere in un determinato indice è possibile utilizzare [0, 1] come indice. Quindi, le opzioni sono:

if File.basename(path)[0] == ?. 

Oppure:

if File.basename(path)[0, 1] == "." 

O anche:

if File.basename(path)[0].chr == "." 
+0

Grazie! Ora ricordo di aver letto su quell'operatore. Questo programmatore Perl ha molto da disimparare. –

1

Significa restituire il codice carattere del carattere successivo. In Ruby, la stringa [0] ti dà un codice di carattere, quindi è come dire che il primo carattere è un ".".

È interessante notare che espressioni come ???!?!?? sono perfettamente legali in Ruby.

Dai uno sguardo allo here.

+0

devo ancora trovare quella parte di Ruby che è "facile da imparare". –

+0

Non so se è incredibilmente facile da imparare, ma ha molti aspetti veramente belli della sua sintassi. Sono principalmente un programmatore JavaScript e ci sono molte volte vorrei avere la sintassi del blocco di Ruby o la sua ortogonalità "tutto restituisce un valore". –

+1

è un uso totalmente casuale della parola ortogonalità. – Peter

2

È una scorciatoia per il punto di codice ASCII del "." carattere. Vedere la documentazione su numeric literals nella sintassi Ruby.

>> ?. 
=> 46 
>> ?a 
=> 97 
+7

Si noti che questo comportamento è cambiato in Ruby 1.9. In Ruby 1.9, '? A' restituisce la stringa' "a" ', che è coerente con l'indicizzazione di una stringa, che restituisce anche una stringa anziché un numero. – newacct