J'ai un fichier, main.rb avec le contenu suivant:
require "tokenizer.rb"
Le fichier tokenizer.rb se trouve dans le même répertoire et son contenu est:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Si j'essaie d'exécuter main.rb, j'obtiens l'erreur suivante:
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>'
Je viens de remarquer que si j'utilise à la load
place de require
tout fonctionne bien. Quel peut être le problème ici?
.rb
extensionRéponses:
Je viens d'essayer et ça marche avec
require "./tokenizer"
. J'espère que cela t'aides.la source
require_relative
comme je l'ai fait dans ma réponse.Faites juste ceci:
Si vous mettez cela dans un fichier Ruby qui se trouve dans le même répertoire que
tokenizer.rb
, cela fonctionnera correctement quel que soit votre répertoire de travail actuel (CWD).Explication des raisons pour lesquelles c'est le meilleur moyen
Les autres réponses prétendent que vous devriez utiliser
require './tokenizer'
, mais ce n'est pas la bonne réponse, car cela ne fonctionnera que si vous exécutez votre processus Ruby dans le même répertoire que celuitokenizer.rb
dans lequel il se trouve. La seule raison d'envisager unerequire
telle utilisation serait prend en charge Ruby 1.8, qui n'a pasrequire_relative
.La
require './tokenizer'
réponse peut fonctionner pour vous aujourd'hui, mais elle limite inutilement la manière dont vous pouvez exécuter votre code Ruby. Demain, si vous souhaitez déplacer vos fichiers vers un répertoire différent, ou si vous souhaitez simplement démarrer votre processus Ruby à partir d'un répertoire différent, vous devrez repenser toutes cesrequire
instructions.Utiliser
require
pour accéder aux fichiers qui se trouvent sur le chemin de chargement est une bonne chose et les gemmes Ruby le font tout le temps. Mais vous ne devriez pas commencer l'argumentrequire
avec un à.
moins que vous ne fassiez quelque chose de très spécial et que vous sachiez ce que vous faites.Lorsque vous écrivez du code qui émet des hypothèses sur son environnement, vous devez réfléchir attentivement aux hypothèses à faire. Dans ce cas, il existe jusqu'à trois façons différentes d'exiger le
tokenizer
fichier, et chacune fait une hypothèse différente:require_relative 'path/to/tokenizer'
: Suppose que le chemin relatif entre les deux fichiers source Ruby restera le même.require 'path/to/tokenizer'
: Suppose qu'il sepath/to/tokenizer
trouve dans l'un des répertoires sur le chemin de chargement ($LOAD_PATH
). Cela nécessite généralement une configuration supplémentaire, car vous devez ajouter quelque chose au chemin de chargement.require './path/to/tokenizer'
: Suppose que le chemin d'accès relatif depuis le répertoire de travail actuel du processus Rubytokenizer.rb
vers restera le même.Je pense que pour la plupart des gens et la plupart des situations, les hypothèses formulées dans les options 1 et 2 sont plus susceptibles de se confirmer avec le temps.
la source
Ruby 1.9 a supprimé le répertoire actuel du chemin de chargement, et vous devrez donc faire une demande relative sur ce fichier, comme le dit David Grayson:
Il n'est pas nécessaire de le suffixer
.rb
, car Ruby est assez intelligente pour savoir que c'est ce que vous voulez dire de toute façon.la source
Ruby 1.9 has removed the current directory from the load path
? Quel est ce répertoire actuel et le chemin de chargement? Merci.require_relative
. Demain, il pourrait tapercd ..
etruby folder/main.rb
être triste que votre solution ne fonctionne plus. Je ne pense pas que l'utilisationrequire
ait aucun avantage ici.require_relative
(qui n'existait pas, ou je ne savais pas à ce sujet, au moment de la publication)require
charge un fichier depuis le$LOAD_PATH
. Si vous souhaitez exiger un fichier relatif au fichier en cours d'exécution au lieu de celui de$LOAD_PATH
, utilisezrequire_relative
.la source
Je recommanderais,
Étant donné que vous savez que le fichier se trouve dans le même répertoire de travail.
Si vous essayez de l'exiger par rapport au fichier, vous pouvez utiliser
J'espère que ça aide.
la source
Une autre petite méthode intéressante consiste à inclure le répertoire actuel dans votre chemin de chargement avec
Vous pouvez le pousser sur le tableau $: ($ LOAD_PATH) mais unshift le forcera à charger votre répertoire de travail actuel avant le reste du chemin de chargement.
Une fois que vous avez ajouté votre répertoire actuel dans votre chemin de chargement, vous n'avez plus besoin de spécifier
et peut simplement revenir à l'utilisation
la source
Cela fonctionnera bien s'il se trouve dans un répertoire gem lib et qu'il s'agit du tokenizer.rb
la source
J'ai utilisé jruby-1.7.4 pour compiler mon code ruby.
est le code qui a généré l'erreur ci-dessous.
J'ai supprimé rb de require et ai donné
Cela a bien fonctionné.
la source
Pour ceux qui sont absolument sûrs que leur chemin relatif est correct, mon problème était que mes fichiers n'avaient pas l'
.rb
extension! (Même si j'avais l'habitudeRubyMine
de créer les fichiers et de sélectionner qu'il s'agissait deRuby
fichiers lors de la création.)Vérifiez les extensions de fichier sur votre fichier!
la source
Qu'en est-il d'inclure le répertoire actuel dans le chemin de recherche?
la source
Le problème est que
require
ne se charge pas à partir du répertoire actuel. C'est ce que je pensais aussi mais ensuite j'ai trouvé ce fil . Par exemple, j'ai essayé le code suivant:Comme on peut le voir, il a lu le fichier ok, mais je ne pouvais pas en avoir besoin (le chemin n'était pas reconnu). et voici le code qui fonctionne:
Comme vous pouvez le voir si vous spécifiez le chemin complet, le fichier se charge correctement.
la source
Première :
Et, vous devez entrer votre mot de passe
Ensuite :
Apparaît Mise à jour de rubygems-update ERREUR: lors de l'exécution de gem ... (OpenSSL :: SSL :: SSLError) le nom d'hôte "gems.ruby-china.org" ne correspond pas au certificat du serveur
Ensuite:
Dernière Quelle langue souhaitez-vous utiliser? [Swift / ObjC]
Souhaitez-vous inclure une application de démonstration dans votre bibliothèque? [ Oui Non ]
Quels frameworks de test utiliserez-vous? [Specta / Kiwi / Aucun]
Souhaitez-vous effectuer des tests basés sur la vue? [ Oui Non ]
Quel est votre préfixe de classe?
Exécution de l'installation du pod sur votre nouvelle bibliothèque.
la source
vous devez donner le chemin. Au moins, vous devez indiquer le chemin du répertoire courant. Cela fonctionnera à coup sûr. ./nom de fichier
la source