Ruta de vuelta a Rubygems.rb -- ruby campo con file-system campo con modules camp codereview Relacionados El problema

Return path to rubygems.rb


3
vote

problema

Español

En la línea de comandos, puedo encontrar fácilmente la ruta en rubygems.rb

  $ gem which rubygems /usr/lib/ruby/1.9.1/rubygems.rb   

y de un script de rubí también puedo hacer esto

  require 'rubygems/commands/which_command' wc = Gem::Commands::WhichCommand.new puts wc.find_paths 'rubygems', $LOAD_PATH   

Sin embargo, es una forma más sencilla para hacer esto, por ejemplo, sin usar
require 'rubygems/commands/which_command' , y sin un system() ¡Llamar?

Actualización de la respuesta publicada

  puts $".grep(/rubygems.rb/).first   

Actualización de comentario publicado

  puts Gem.method(:dir).source_location.first   
Original en ingles

From the command line, I can easily find the path to rubygems.rb

$ gem which rubygems /usr/lib/ruby/1.9.1/rubygems.rb 

and from a Ruby script I can also do this

require 'rubygems/commands/which_command' wc = Gem::Commands::WhichCommand.new puts wc.find_paths 'rubygems', $LOAD_PATH 

However is a simpler way available to do this, for example without using
require 'rubygems/commands/which_command', and without a system() call?

Update from posted answer

puts $".grep(/rubygems.rb/).first 

Update from posted comment

puts Gem.method(:dir).source_location.first 
        
   
   

Lista de respuestas

3
 
vote
vote
La mejor respuesta
 

Si existe una solución más sencilla depende de cuál es su motivación.

Veamos dentro de la implementación de guessedAnswer += "(letter)" 1 .

  guessedAnswer += "(letter)" 2  

Ese es el código que necesita. Si hubiera una forma más sencilla, guessedAnswer += "(letter)" 3 lo habría usado.

Sin embargo, hay una manera de hacer trampa: guessedAnswer += "(letter)" 4 necesita hacer una cosa muy similar cuando realmente intenta cargar un módulo:

Requerir (Nombre) → True o Falso

Carga el 99887766655443315, devolviendo guessedAnswer += "(letter)" 6 Si tiene éxito y 99887766555443317 si La característica ya está cargada.

Si el nombre de archivo no se resuelve a una ruta absoluta, será buscados en los directorios enumerados en guessedAnswer += "(letter)" 8 ( 99887766555443319 ).

Si el nombre de archivo tiene la extensión ".rb", se carga como fuente expediente; Si la extensión es ".SO", ".O", o ".dll", o el valor predeterminado Extensión de la biblioteca compartida en la plataforma actual, Ruby carga el Biblioteca compartida como una extensión de rubí. De lo contrario, Ruby intenta agregar ".Rb", ".SO", y así sucesivamente al nombre hasta que se encontró. Si el archivo nombrado no se puede encontrar, se elevará un 99887777665544332020 .

para extensiones de ruby ​​El nombre de archivo dado puede usar cualquier biblioteca compartida extensión. Por ejemplo, en Linux, la extensión del zócalo es "Socket.SO" y guessedAnswer.append(letter) 1 cargará la extensión del zócalo.

Se agrega la ruta absoluta del archivo cargado a guessedAnswer.append(letter) 2 ( guessedAnswer.append(letter) 3 ). Un archivo no se cargará de nuevo si su camino ya aparece en guessedAnswer.append(letter) 4 . Por ejemplo, guessedAnswer.append(letter) 5 no se cargará guessedAnswer.append(letter) 6 otra vez.

O, podría ser más preciso decir que guessedAnswer.append(letter) 7 simula lo que haría .

Por lo tanto, si está dispuesto a dejar que Ruby en realidad cargue el archivo primero, entonces podría preguntar a Ruby después del hecho:

  guessedAnswer.append(letter) 9  
 

Whether a simpler solution exists depends on what your motivation is.

Let's look inside the implementation of Gem::Commands::WhichCommand#find_paths.

  def find_paths(package_name, dirs)     result = []      dirs.each do |dir|       Gem.suffixes.each do |ext|         full_path = File.join dir, "#{package_name}#{ext}"         if File.exist? full_path and not File.directory? full_path then           result << full_path           return result unless options[:show_all]         end       end     end      result   end 

That's the code you need. If there were a simpler way, find_paths would have used it.

However, there is a way to cheat: Kernel#require needs to do a very similar thing when it actually tries to load a module:

require(name) xe2x86x92 true or false

Loads the given name, returning true if successful and false if the feature is already loaded.

If the filename does not resolve to an absolute path, it will be searched for in the directories listed in $LOAD_PATH ($:).

If the filename has the extension xe2x80x9c.rbxe2x80x9d, it is loaded as a source file; if the extension is xe2x80x9c.soxe2x80x9d, xe2x80x9c.oxe2x80x9d, or xe2x80x9c.dllxe2x80x9d, or the default shared library extension on the current platform, Ruby loads the shared library as a Ruby extension. Otherwise, Ruby tries adding xe2x80x9c.rbxe2x80x9d, xe2x80x9c.soxe2x80x9d, and so on to the name until found. If the file named cannot be found, a LoadError will be raised.

For Ruby extensions the filename given may use any shared library extension. For example, on Linux the socket extension is xe2x80x9csocket.soxe2x80x9d and require 'socket.dll' will load the socket extension.

The absolute path of the loaded file is added to $LOADED_FEATURES ($"). A file will not be loaded again if its path already appears in $". For example, require 'a'; require './a' will not load a.rb again.

Or, it might be more accurate to say that find_paths simulates what require would do.

Therefore, if you are willing to let Ruby actually load the file first, then you could ask Ruby after the fact:

require 'rubygems' $LOADED_FEATURES.grep /\/rubygems\./ 
 
 

Relacionados problema

9  Cargando y usando Scripts LUA  ( Loading and using lua scripts ) 
He estado experimentando con la integración de LUA en OBJETIVO-C. He tratado de hacer el mínimo para obtener LUA para calcular los valores y devolverlos. No q...

0  Script de Analytics Ad-Hoc al módulo / Paquete  ( Ad hoc analytics script to module package ) 
Tengo un proceso de análisis de texto que complete para trabajar. Este proceso minas texto para diferentes cuentas de Twitter y encuentra patrones en los Twee...

5  Analizador de rss para nodo.js  ( Rss parser for node js ) 
Me gustaría que alguien revise este código y le diría si se puede hacer mejor, o si el código es elegante y lo suficientemente simple para la tarea en cuestió...

3  JavaScript Módulos Cargando con EVAL ()  ( Javascript modules loading with eval ) 
Recientemente pidí usarlo MyVar2 para una función de módulo . Ahora terminé haciendo una función muy extraña que hace lo que quiero. Me gusta la idea que l...

4  Módulo para validar y sumar una cadena que no contiene números negativos  ( Module to validate and sum a string containing no negative numbers ) 
Para aprender el idioma de JavaScript, hice un ejercicio de dojo de Roy OsHerove. ¿Hay una mejor manera de organizar esto para que el único método exportado s...

16  Rutas exportadoras en Node.js Express 4  ( Exporting routes in node js express 4 ) 
Estoy usando Express 4 para proporcionar rutas a archivos HTML / JADE, y también para proporcionar una API. Quiero separar las rutas del archivo del servido...

4  Fusionando con diferentes módulos  ( Merging with different modules ) 
Tenemos una combinación de acción para dos proyectos. En los proyectos tenemos diferentes módulos, como alimento, archivos, post, etc ... ["something"; "so...

1  Biblioteca para imitar lienzo usando divs  ( Library to mimic canvas using divs ) 
Recientemente estuve desarrollando una biblioteca de lienzos y (imitando el lienzo con DIV). El requisito era desarrollar algo sin utilizar ninguna biblioteca...

2  Patrón de código JavaScript  ( Javascript code pattern ) 
He estado trabajando en un proyecto pesado JavaScript. Hay ventas, compras, informes, etc. Lo que he hecho se creó un módulo separado para cada I.E. Un módulo...

6  Juego de serpientes usando un lienzo  ( Snake game using a canvas ) 
Estoy tratando de alcanzar una buena comprensión de cómo construir una estructura de aplicación modular escalable. Recientemente he estado practicando con lie...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos