2009-10-23 21 views
6

estoy aprendiendo Rubí y encontramos este ejemplo de código en algún tipo de documentación:¿Qué significa la sintaxis? decir en este ejemplo de 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 

El propósito es resumir los tamaños de archivo de todos los archivos en un árbol, excluyendo los directorios que empiezan por un punto. La línea if File.basename(path)[0] == ?. obviamente está realizando la prueba del nombre del directorio. Yo habría escrito así:

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

¿Qué ?. hacer? (Podría ser un error tipográfico, supongo). No he visto esta sintaxis descrita en otro lugar.

Respuesta

11

?. devuelve el valor ASCII del punto. Puede poner casi cualquier char después del signo de interrogación para obtener su valor ASCII, como ?a o ?3 o ?\\, etc. La razón por la que no lo están comparando con la cadena "." es que cuando indiza en una cadena, obtiene el ASCII valor del carácter en ese índice en lugar del carácter en sí. Para obtener el carácter en un índice determinado, puede usar [0, 1] como índice. Por lo que las opciones son:

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

O:

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

O incluso:

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

¡Gracias! Ahora recuerdo haber leído sobre ese operador. Este programador de Perl tiene mucho que desaprender. –

1

Significa devolver el código del carácter siguiente. En Ruby, decir cadena [0] te da un código de carácter, así que es como decir que el primer carácter es "."

Curiosamente, significa que expresiones como ???!?!?? son perfectamente legales en Ruby.

Echa un vistazo here.

+0

todavía tengo que encontrar esa parte de Ruby que es "fácil de aprender". –

+0

No sé si es increíblemente fácil de aprender, pero tiene muchos aspectos realmente buenos para su sintaxis. Principalmente soy un programador de JavaScript y muchas veces desearía tener la sintaxis de bloque de Ruby o su ortogonalidad de "todo devuelve un valor". –

+1

es un uso totalmente aleatorio de la palabra ortogonalidad. – Peter

2

Es una abreviación para el punto de código ASCII del "." personaje. Consulte la documentación en numeric literals en la sintaxis de Ruby.

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

Tenga en cuenta que este comportamiento cambió en Ruby 1.9. En Ruby 1.9, '? A' devuelve la cadena' "a" ', que es consistente con la indexación de una cadena, que también devuelve una cadena en lugar de un número. – newacct