Utilização do require
|
|
Pessoal sou bem básico no Ruby ainda, comprei o livro Programming Ruby(Pragmatic Programmers) e estou estudando primeiro o Ruby mesmo, para depois entrar em Rails e tal. Como dúvida basica queria utilizar o require, tipo tenho 3 classes numa pasta que criei dentro do projeto, e dentro de uma delas tentei fazer referencia a outra e recebi . Como posso resolver, tentei usar tipo achando que ia pegar tudo dentro da pasta ouGrato, Alberto |
|
|
Então, eu coloquei e funcionou, mas tem algum jeito de fazer um require *? Outra coisa, o require sempre considera o root do projeto? estou usando a ultima versão estavel do Ruby 1.8.6… Valeuz, Alberto |
|
|
|
|
|
O método `require` tem uma lista de diretórios onde normalmente procura os scripts que pode ser acessada através da variável global especial `$:`. No meu sistema (e no seu deve ser algo parecido), a lista de diretórios é a seguinte: Note que o último diretório que deve ser buscado é o diretório de trabalho atual: o diretório de onde o programa foi disparado. Note também que o diretório do seu programa não está nessa lista, então ele não vai nem ser considerado na busca. Pelo que você relatou, Alberto, sua estrutura de diretórios deve estar parecida com isso:
project_root
|--- account
| |--- account.rb (f)
| |--- accounts.rb (f)
|--- test
|--- account_test.rb (f)
Imagino que você deva estar invocando o script de teste `account_test.rb` a partir do `project_root`: /tmp/project_root$ ruby test/account_test.rb Quando você usa caminhos relativos ao `project_root`, tudo funciona como esperado. Mas se você tentar disparar o script a partir de outro diretório qualquer, seu castelinho de cartas vai desmoronar. Felizmente há soluções para isso. A primeira delas é fornecer caminhos absolutos para o `require`. Há outra variável especial que você pode usar para isso: `FILE` (o fórum danificou a formatação, mas olhe no código abaixo). Ela armazena o nome do arquivo do script que está sendo interpretado e pode ser combinada com os métodos `File.dirname` (que extrai somente o nome de diretório de um nome de arquivo) e `File.expand_path` (que interpreta e expande um endereço relativo para um endereço absoluto). Se o seu script de teste referenciar os demais scripts desse modo, tudo deve funcionar independendo de onde seja disparado: (Observe que estou assumindo a estrutura de diretórios que citei anteriormente. Se a sua estrutura não estiver parecida com essa, este trecho vai precisar ser adaptado) Uma segunda solução é incrementar o caminho de busca, através da variável `$:` e usar os caminhos sabendo que o `project_root` estará lá: (`unshift` coloca o diretório na frente da lista de busca, você pode usar qualquer um dos métodos de Array, como `<<` ou `push`, conforme sua necessidade) Há muitas variações que você pode fazer sobre este tema e estas são só duas opções. Divirta-se! |
|
|
Thiago, fiquei meio em duvida sobre sua explicação, em meu projeto, como é apenas de teste, não fiquei preocupada numa organização muita logica das pastas e tal, então tenho a seguinte estrura: Esses exemplos de require que vc citou, seria no arquivo mesmo, ou em algum lugar de configuracao? Outra coisa, se eu coloquei require “account/account” e ele identificou, o caminho não está relativo ao project root? Alberto |
|
|
Tem a variável de ambiente RUBYLIB, que você pode usar para estender o caminho de busca, mas os exemplos que dei são para serem incluídos no seu script diretamente. Sobre o caminho estar relativo ou não ao project root, sim, ele está. Não porque o padrão seja este, mas porque você deve estar executando seus scripts com o diretório de trabalho no `project_root`. Se você mudar para o `project_root/account`, e tentar executar o script, provavelmente vai receber um erro:
/tmp/project_root$ ruby account/account_test.rb
Account
/tmp/project_root$ cd account/
/tmp/project_root/account$ ruby account_test.rb
account_test.rb:1:in `require': no such file to load -- account/account (LoadError)
from account_test.rb:1
O mesmo deve acontecer se você disparar o script de teste a partir de qualquer outro diretório… |
|
|
Tem duas formar de setar o path. Primeira, definindo dentro do seu código. /tmp/teste/coisa/class1.rb /tmp/teste/coisa/class3.rb /tmp/teste/coisa/class2.rb /tmp/teste/main.rb Teríamos dentro do arquivo main.rb o código ou Via parâmetro do interpretator executado assim tmp$ ruby -D coisa:/outro/dir/seu main.rb de forma semelhante ao parametro -cp(classpath) da finada Java. |
|
|
Pessoal valeu pela ajuda. Acho que require não será mais um problema heheehe Alberto |

