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 ]
Sí
¿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:
-
require_relative ''path/to/tokenizer''
: supone que la ruta relativa entre los dos archivos fuente de Ruby se mantendrá igual. -
require ''path/to/tokenizer''
: supone quepath/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. -
require ''./path/to/tokenizer''
:require ''./path/to/tokenizer''
que la ruta relativa del directorio de trabajo actual del proceso Ruby atokenizer.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''