2011-03-01 15 views
45

¿Qué está haciendo lo siguiente y por qué está en la parte superior de la página?

$:.unshift File.dirname(__FILE__) 

https://github.com/mojombo/jekyll/blob/master/lib/jekyll.rb

+8

+1 en simpatía por encontrarse con uno de los pedazos más feos de Ruby. Pregunta relacionada: http://stackoverflow.com/questions/1395688/unshift-file-join-in-ruby –

Respuesta

51

Está añadiendo el directorio del archivo actual en el camino de carga. $: representa la ruta de carga (que es una matriz) y unshift antes del comienzo de la matriz.

La razón por la que está ahí (y en la parte superior) es para que todos los que lo requieran no tengan que preocuparse por la ruta.

7

Técnicamente está agregando la ruta del archivo como la primera entrada de la ruta de carga que ruby ​​usa para buscar archivos. $: es una variable mágica y se hace referencia más clara a $ LOAD_PATH.

ruby-1.9.2-p136 > $LOAD_PATH 
=> ["/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
ruby-1.9.2-p136 > $: 
=> ["/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
ruby-1.9.2-p136 > $:.unshift '.' 
=> [".", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/site_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.6.0", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/vendor_ruby", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1", "/Users/wesbailey/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/x86_64-darwin10.6.0"] 
+0

Sé que esta era una pregunta muy antigua, pero ¿hay alguna razón para agregarla a la cabeza en lugar de a la cola (con empuje, decir)? ¿Esto es así para que tenga prioridad de una manera similar a la Unión sobre los archivos con el mismo nombre? (Una carpeta de hotfix). – mckenzm

+0

@mckenzm Sí. Usted lo agrega a la cabecera porque quiere que el archivo en el directorio actual se descubra primero en la ruta de carga. La ruta de carga se recorre en orden de principio a fin al buscar archivos. – Wes

+0

A eso me dirigía, por lo que para el desarrollo, los directorios Unit Testing tienen prioridad sobre los directorios de prueba de integración, etc. – mckenzm

3

Se añade la ruta actual directorio de trabajo a todos los requerir utilizado en el proyecto, después de añadir esto en la parte superior que no tienen que preocuparse por la ruta del archivo que requerimos, pero todo el archivo que estamos requiriendo debe estar en el mismo directorio donde nuestro programa principal requiera otros archivos.

$: se reserva la palabra clave para cargar la ruta.

Cuestiones relacionadas