modules mixin from another ruby require

mixin - ruby import class from another file



Ruby ''require'' error: no se puede cargar dicho archivo (13)

¿Qué hay de incluir el directorio actual en la ruta de búsqueda?

ruby -I. main.rb

Tengo un archivo, main.rb con el siguiente contenido:

require "tokenizer.rb"

El archivo tokenizer.rb está en el mismo directorio y su contenido es:

class Tokenizer def self.tokenize(string) return string.split(" ") end end

Si intento ejecutar main.rb obtengo el siguiente error:

C:/Documents and Settings/my/src/folder>ruby main.rb C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'': cannot load such file -- tokenizer.rb (LoadError) from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '' from main.rb:1:in `<main>''

Me di cuenta de que si uso load lugar de require todo funciona bien. ¿Cuál puede ser el problema aquí?


Acabo de probar y funciona con require "./tokenizer" . Espero que esto ayude.


El problema es que require no se carga desde el directorio actual. Esto es lo que pensé, también, pero luego encontré este thread . Por ejemplo, probé el siguiente código:

irb> f = File.new(''blabla.rb'') => #<File:blabla.rb> irb> f.read => "class Tokenizer/n def self.tokenize(string)/n return string.split( /" /")/n end/nend/n" irb> require f LoadError: cannot load such file -- blabla.rb from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req uire'' from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req uire'' from (irb):24 from D:/dev/Ruby193/bin/irb:12:in `<main>''

Como se puede ver, leyó el archivo correctamente, pero no pude exigirlo (la ruta no fue reconocida). y aquí va el código que funciona:

irb f = File.new(''D://blabla.rb'') => #<File:D://blabla.rb> irb f.read => "class Tokenizer/n def self.tokenize(string)/n return string.split( /" /")/n end/nend/n" irb> require f => true

Como puede ver, si especifica la ruta completa, el archivo se carga correctamente.


Otro buen método es incluir el directorio actual en su ruta de carga con

$:.unshift(''.'')

Puede presionarlo en la matriz $: ($ LOAD_PATH) pero desviarlo lo forzará a cargar su directorio de trabajo actual antes que el resto de la ruta de carga.

Una vez que haya agregado su directorio actual en su ruta de carga, no necesita seguir especificando

require ''./tokenizer''

y solo puedo volver a usar

require ''tokenizer''


Para aquellos que están absolutamente seguros de que su ruta relativa es correcta, mi problema fue que mis archivos no tenían la extensión .rb . (Aunque utilicé RubyMine para crear los archivos y seleccioné que eran archivos Ruby en la creación).

¡Revisa las extensiones de archivo en tu archivo!


Primero :

$ sudo gem install colored2

Y, debes ingresar tu contraseña

Entonces :

$ sudo gem update --system

Aparecer Actualizando rubygems-update ERROR: Al ejecutar gem ... (OpenSSL :: SSL :: SSLError) el nombre de host "gems.ruby-china.org" no coincide con el certificado del servidor

Entonces:

$ rvm -v $ rvm get head

Último ¿Qué idioma quieres usar? [Swift / ObjC]

ObjC

¿Le gustaría incluir una aplicación de demostración con su biblioteca? [ Si no ]

¿Qué frameworks de prueba usarás? [Specta / Kiwi / None]

Ninguna

¿Te gustaría hacer una prueba basada en la vista? [ Si no ]

No

¿Cuál es el prefijo de tu clase?

XMG

Ejecución de la instalación de pod en su nueva biblioteca.


Ruby 1.9 ha eliminado el directorio actual de la ruta de carga, por lo que deberá realizar una solicitud relativa en este archivo, como dice David Grayson:

require_relative ''tokenizer''

No hay necesidad de .rb sufijo con .rb , ya que Ruby es lo suficientemente inteligente como para saber que eso es lo que quieres decir de todos modos.


Solo haz esto:

require_relative ''tokenizer''

Si coloca esto en un archivo Ruby que está en el mismo directorio que tokenizer.rb , funcionará bien, sin importar cuál sea su directorio actual de trabajo (CWD).

Explicación de por qué esta es la mejor manera

Las otras respuestas afirman que debe usar require ''./tokenizer'' , pero esa es la respuesta incorrecta , porque solo funcionará si ejecuta su proceso Ruby en el mismo directorio en el que tokenizer.rb está. Casi la única razón para considerarlo usar require like sería si necesitas soportar Ruby 1.8, que no tiene require_relative .

La respuesta require ''./tokenizer'' puede funcionar para usted hoy, pero limita innecesariamente las formas en que puede ejecutar su código Ruby. Mañana, si desea mover sus archivos a un directorio diferente, o simplemente desea iniciar su proceso Ruby desde un directorio diferente, tendrá que volver a pensar en todos los que require declaraciones.

Usar require para acceder a los archivos que están en la ruta de carga es algo bueno y las gemas Ruby lo hacen todo el tiempo. Pero no debe comenzar el argumento para require con a . a menos que esté haciendo algo muy especial y sepa lo que está haciendo.

Cuando escribe código que hace suposiciones sobre su entorno, debe pensar cuidadosamente sobre qué suposiciones hacer. En este caso, hay hasta tres formas diferentes de requerir el archivo tokenizer , y cada uno hace una suposición diferente:

  1. require_relative ''path/to/tokenizer'' : supone que la ruta relativa entre los dos archivos fuente de Ruby se mantendrá igual.
  2. require ''path/to/tokenizer'' : supone que path/to/tokenizer está dentro de uno de los directorios en la ruta de carga ( $LOAD_PATH ). Esto generalmente requiere configuración adicional, ya que debe agregar algo a la ruta de carga.
  3. require ''./path/to/tokenizer'' : require ''./path/to/tokenizer'' que la ruta relativa del directorio de trabajo actual del proceso Ruby a tokenizer.rb se mantendrá igual.

Creo que para la mayoría de las personas y la mayoría de las situaciones, es más probable que las suposiciones hechas en las opciones n. ° 1 y n. ° 2 sean verdaderas a lo largo del tiempo.


Usé jruby-1.7.4 para compilar mi código Ruby.

require ''roman-numerals.rb''

es el código que arrojó el siguiente error.

LoadError: no such file to load -- roman-numerals require at org/jruby/RubyKernel.java:1054 require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36 (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

Eliminé rb de require y di

require ''roman-numerals''

Funcionó bien


Yo recomendaria,

load ''./tokenizer.rb''

Dado que usted sabe que el archivo está en el mismo directorio de trabajo.

Si intentas solicitarlo en relación con el archivo, puedes usar

require_relative ''tokenizer''

Espero que esto ayude.


necesitas dar el camino. Al menos debes dar la ruta desde el directorio actual. Funcionará seguro. ./nombre del archivo


require carga un archivo de $LOAD_PATH . Si desea solicitar un archivo relativo al archivo que se está ejecutando actualmente en lugar de $LOAD_PATH , use require_relative .


require_relative ''tokenizer/main''

Esto funcionará muy bien si está en un directorio gem lib y este es el tokenizer.rb