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 me sale 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>'
Acabo de notar que si uso en load
lugar de require
todo funciona bien. ¿Cuál puede ser el problema aquí?
.rb
extensiónRespuestas:
Acabo de intentarlo y funciona
require "./tokenizer"
. Espero que esto ayude.fuente
require_relative
como lo hice en mi respuesta.Solo haz esto:
Si coloca esto en un archivo Ruby que está en el mismo directorio
tokenizer.rb
, funcionará bien sin importar cuál sea su directorio de trabajo actual (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 que setokenizer.rb
encuentra. Casi la única razón para considerar el uso derequire
esa manera sería si necesita admite Ruby 1.8, que no tienerequire_relative
.La
require './tokenizer'
respuesta podría 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 repensar todas esasrequire
declaraciones.Usar
require
para acceder a los archivos que están en la ruta de carga es algo bueno y las gemas de Ruby lo hacen todo el tiempo. Pero no debe comenzar el argumentorequire
con un 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
tokenizer
archivo, y cada una asume de manera diferente:require_relative 'path/to/tokenizer'
: Asume que la ruta relativa entre los dos archivos fuente de Ruby se mantendrá igual.require 'path/to/tokenizer'
: Asume quepath/to/tokenizer
está dentro de uno de los directorios en la ruta de carga ($LOAD_PATH
). Esto generalmente requiere una configuración adicional, ya que debe agregar algo a la ruta de carga.require './path/to/tokenizer'
: Asume que la ruta relativa desde el directorio de trabajo actual del proceso Ruby hastatokenizer.rb
se mantendrá igual.Creo que para la mayoría de las personas y la mayoría de las situaciones, las suposiciones hechas en las opciones n. ° 1 y n. ° 2 tienen más probabilidades de ser ciertas con el tiempo.
fuente
Ruby 1.9 ha eliminado el directorio actual de la ruta de carga, por lo que deberá hacer un requisito relativo en este archivo, como dice David Grayson:
No hay necesidad de sufijo
.rb
, ya que Ruby es lo suficientemente inteligente como para saber que a eso te refieres de todos modos.fuente
Ruby 1.9 has removed the current directory from the load path
? ¿Cuál es este directorio actual y ruta de carga? Gracias.require_relative
. Mañana podría escribircd ..
y luegoruby folder/main.rb
y estar triste porque su solución ya no funciona. No creo que usarrequire
tenga ningún beneficio aquí.require_relative
(que no existía, o no lo sabía al momento de la publicación)require
carga un archivo desde el$LOAD_PATH
. Si desea solicitar un archivo relativo al archivo que se está ejecutando actualmente en lugar del archivo$LOAD_PATH
, userequire_relative
.fuente
Yo recomendaria,
Dado que sabe que el archivo está en el mismo directorio de trabajo.
Si intenta solicitarlo en relación con el archivo, puede usar
Espero que esto ayude.
fuente
Otro pequeño método es incluir el directorio actual en su ruta de carga con
Puede empujarlo a la matriz $: ($ LOAD_PATH) pero unshift lo obligará a cargar su directorio de trabajo actual antes del resto de la ruta de carga.
Una vez que haya agregado su directorio actual en su ruta de carga, no necesita seguir especificando
y puedo volver a usar
fuente
Esto funcionará bien si está en un directorio de la biblioteca de gemas y este es el tokenizer.rb
fuente
Usé jruby-1.7.4 para compilar mi código ruby.
es el código que arrojó el siguiente error.
Quité rb de require y di
Funcionó bien.
fuente
Para aquellos que están absolutamente seguros de que su ruta relativa es correcta, ¡mi problema fue que mis archivos no tenían la
.rb
extensión! (A pesar de que he utilizadoRubyMine
para crear los archivos y seleccionado que eranRuby
archivos en la creación.)¡Verifique dos veces las extensiones de archivo en su archivo!
fuente
¿Qué hay de incluir el directorio actual en la ruta de búsqueda?
fuente
El problema es que
require
no se carga desde el directorio actual. Esto es lo que pensé también, pero luego encontré este hilo . Por ejemplo probé el siguiente código:Como se puede ver, leyó bien el archivo, pero no pude requerirlo (no se reconoció la ruta). y aquí va el código que funciona:
Como puede ver si especifica la ruta completa, el archivo se carga correctamente.
fuente
Primero :
Y, debe ingresar su contraseña
Luego :
Aparece 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
Luego:
Último ¿Qué idioma quieres usar? [Swift / ObjC]
¿Le gustaría incluir una aplicación de demostración con su biblioteca? [ Sí No ]
¿Qué marcos de prueba usarás? [Specta / Kiwi / Ninguno]
¿Te gustaría hacer pruebas basadas en la vista? [ Sí No ]
¿Cuál es tu prefijo de clase?
Ejecutando pod install en su nueva biblioteca.
fuente
Necesitas dar el camino. Al menos debe dar la ruta desde el directorio actual. Funcionará seguro. ./nombre del archivo
fuente