Eu tenho um arquivo, main.rb, com o seguinte conteúdo:
require "tokenizer.rb"
O arquivo tokenizer.rb está no mesmo diretório e seu conteúdo é:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Se eu tentar executar o main.rb, recebo o seguinte erro:
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>'
Acabei de perceber que se eu usar em load
vez de require
tudo funcionará bem. Qual pode ser o problema aqui?
.rb
extensãoRespostas:
Eu apenas tentei e funciona
require "./tokenizer"
. Espero que isto ajude.fonte
require_relative
como fiz na minha resposta.Apenas faça o seguinte:
Se você colocar isso em um arquivo Ruby que esteja no mesmo diretório que
tokenizer.rb
, ele funcionará bem, independentemente do seu diretório de trabalho atual (CWD).Explicação de por que essa é a melhor maneira
As outras respostas afirmam que você deve usar
require './tokenizer'
, mas essa é a resposta errada , porque só funcionará se você executar o processo Ruby no mesmo diretório em quetokenizer.rb
está. O único motivo para considerar o usorequire
desse tipo seria se você precisar suporta Ruby 1.8, que não possuirequire_relative
.A
require './tokenizer'
resposta pode funcionar para você hoje, mas limita desnecessariamente as maneiras pelas quais você pode executar seu código Ruby. Amanhã, se você deseja mover seus arquivos para um diretório diferente, ou apenas deseja iniciar seu processo Ruby a partir de um diretório diferente, precisará repensar todas essasrequire
instruções.Usar
require
para acessar arquivos que estão no caminho de carregamento é uma coisa boa e as gemas Ruby fazem isso o tempo todo. Mas você não deve iniciar o argumentorequire
com a.
menos que esteja fazendo algo muito especial e saiba o que está fazendo.Ao escrever um código que faça suposições sobre seu ambiente, você deve pensar cuidadosamente sobre quais suposições devem ser feitas. Nesse caso, existem até três maneiras diferentes de exigir o
tokenizer
arquivo e cada uma faz uma suposição diferente:require_relative 'path/to/tokenizer'
: Assume que o caminho relativo entre os dois arquivos de origem Ruby permanecerá o mesmo.require 'path/to/tokenizer'
: Assume quepath/to/tokenizer
está dentro de um dos diretórios no caminho de carregamento ($LOAD_PATH
). Isso geralmente requer configuração extra, pois você precisa adicionar algo ao caminho de carregamento.require './path/to/tokenizer'
: Assume que o caminho relativo do diretório de trabalho atual do processo Rubytokenizer.rb
permanecerá o mesmo.Penso que, para a maioria das pessoas e para a maioria das situações, é mais provável que as suposições feitas nas opções 1 e 2 sejam verdadeiras ao longo do tempo.
fonte
O Ruby 1.9 removeu o diretório atual do caminho de carregamento e, portanto, você precisará fazer um requisito relativo nesse arquivo, como diz David Grayson:
Não há necessidade de sufixo
.rb
, pois Ruby é inteligente o suficiente para saber que é isso que você quer dizer.fonte
Ruby 1.9 has removed the current directory from the load path
? Qual é o diretório atual e o caminho de carregamento? Obrigado.require_relative
. Amanhã ele pode digitarcd ..
eruby folder/main.rb
ficar triste por sua solução não funcionar mais. Eu não acho que o usorequire
tenha algum benefício aqui.require_relative
(que não existe, ou eu não sabia sobre isso, no momento da postagem)require
carrega um arquivo do$LOAD_PATH
. Se você deseja exigir um arquivo relativo ao arquivo em execução no momento, e não a partir de$LOAD_PATH
, userequire_relative
.fonte
Eu recomendaria,
Dado que você sabe que o arquivo está no mesmo diretório de trabalho.
Se você está tentando exigi-lo em relação ao arquivo, pode usar
Eu espero que isso ajude.
fonte
Outro método interessante é incluir o diretório atual no caminho de carregamento com
Você pode enviá-lo para a matriz $: ($ LOAD_PATH), mas a mudança para forçar o carregamento do diretório de trabalho atual antes do restante do caminho de carregamento.
Depois de adicionar o diretório atual ao caminho de carregamento, você não precisa especificar
e pode voltar a usar
fonte
Isso funcionará bem se estiver em um diretório gem lib e este for o tokenizer.rb
fonte
Eu usei o jruby-1.7.4 para compilar meu código ruby.
é o código que gerou o erro abaixo.
Eu removi a rb do require e dei
Funcionou bem.
fonte
Para aqueles que têm certeza absoluta de que seu caminho relativo está correto, meu problema era que meus arquivos não tinham a
.rb
extensão! (Embora eu tenhaRubyMine
criado os arquivos e selecionado que eles eramRuby
arquivos na criação.)Verifique as extensões do seu arquivo!
fonte
Que tal incluir o diretório atual no caminho de pesquisa?
fonte
O problema é que
require
não carrega do diretório atual. Isto é o que eu pensava também, mas então encontrei este tópico . Por exemplo, tentei o seguinte código:Como pode ser visto, ele leu o arquivo ok, mas eu não poderia exigi-lo (o caminho não foi reconhecido). e aqui vai o código que funciona:
Como você pode ver se você especificar o caminho completo, o arquivo será carregado corretamente.
fonte
Primeiro :
E, você deve inserir sua senha
Então :
Aparece Atualizando rubygems-update ERRO: Ao executar o gem ... (OpenSSL :: SSL :: SSLError) o nome do host "gems.ruby-china.org" não corresponde ao certificado do servidor
Então:
Última Qual idioma você deseja usar ?? [Swift / ObjC]
Deseja incluir um aplicativo de demonstração na sua biblioteca? [ Sim não ]
Quais estruturas de teste você usará? [Specta / Kiwi / Nenhum]
Deseja fazer testes com base em visualizações? [ Sim não ]
Qual é o seu prefixo de classe?
Instalação do pod em execução na sua nova biblioteca.
fonte
você precisa dar o caminho. Pelo menos você deve indicar o caminho do diretório atual. Isso funcionará com certeza. ./nome do arquivo
fonte