Mam jeden plik main.rb z następującą zawartością:
require "tokenizer.rb"
Plik tokenizer.rb znajduje się w tym samym katalogu, a jego zawartość to:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Jeśli spróbuję uruchomić main.rb, pojawia się następujący błąd:
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>'
Właśnie zauważyłem, że jeśli używam load
zamiast require
wszystkiego, działa dobrze. Jaki może być problem?
.rb
rozszerzenieOdpowiedzi:
Właśnie próbowałem i działa
require "./tokenizer"
. Mam nadzieję że to pomoże.źródło
require_relative
co zrobiłem w mojej odpowiedzi.Po prostu zrób to:
Jeśli umieścisz to w pliku Ruby, który znajduje się w tym samym katalogu, co
tokenizer.rb
, będzie działać dobrze bez względu na twój bieżący katalog roboczy (CWD).Wyjaśnienie, dlaczego jest to najlepszy sposób
Inne odpowiedzi twierdzą, że powinieneś użyć
require './tokenizer'
, ale to jest zła odpowiedź, ponieważ będzie działać tylko wtedy, gdy uruchomisz swój proces Ruby w tym samym katalogu, w którym siętokenizer.rb
znajduje. Prawie jedynym powodem do rozważenia użyciarequire
takiego byłoby, gdybyś musiał obsługuje Ruby 1.8, który nie marequire_relative
.require './tokenizer'
Odpowiedź może pracować dla Ciebie dzisiaj, ale niepotrzebnie ogranicza w jaki sposób można uruchomić kod Ruby. Jutro, jeśli zechcesz przenieść swoje pliki do innego katalogu lub po prostu zechcesz rozpocząć proces w Ruby z innego katalogu, będziesz musiał przemyśleć wszystkie terequire
instrukcje.Korzystanie
require
z dostępu do plików znajdujących się na ścieżce ładowania to dobra rzecz, a klejnoty Rubiego robią to przez cały czas. Ale nie powinieneś zaczynać kłótnirequire
od a,.
chyba że robisz coś wyjątkowego i nie wiesz, co robisz.Kiedy piszesz kod, który przyjmuje założenia dotyczące swojego środowiska, powinieneś dokładnie przemyśleć, jakie założenia przyjąć. W takim przypadku istnieją trzy różne sposoby żądania
tokenizer
pliku, a każdy z nich przyjmuje inne założenie:require_relative 'path/to/tokenizer'
: Zakłada, że względna ścieżka między dwoma źródłowymi plikami Ruby pozostanie taka sama.require 'path/to/tokenizer'
: Zakłada, żepath/to/tokenizer
znajduje się w jednym z katalogów na ścieżce ładowania ($LOAD_PATH
). Zwykle wymaga to dodatkowej konfiguracji, ponieważ musisz coś dodać do ścieżki ładowania.require './path/to/tokenizer'
: Zakłada, że ścieżka względna z bieżącego katalogu roboczego procesu Rubytokenizer.rb
do pozostanie taka sama.Myślę, że dla większości ludzi i większości sytuacji założenia przyjęte w opcjach nr 1 i nr 2 z większym prawdopodobieństwem sprawdzą się z upływem czasu.
źródło
Ruby 1.9 usunął bieżący katalog ze ścieżki ładowania, więc będziesz musiał wykonać względne wymaganie dla tego pliku, jak mówi David Grayson:
Nie ma potrzeby dodawania sufiksu
.rb
, ponieważ Ruby jest wystarczająco sprytna, by wiedzieć, że i tak to masz na myśli.źródło
Ruby 1.9 has removed the current directory from the load path
? Co to jest bieżący katalog i ścieżka ładowania? Dzięki.require_relative
. Jutro może pisać,cd ..
a potemruby folder/main.rb
być smutnym, że twoje rozwiązanie już nie działa. Nie sądzę, aby używanierequire
miało tutaj jakąkolwiek korzyść.require_relative
(które nie istniało lub nie wiedziałem o tym w momencie wysyłania)require
ładuje plik z$LOAD_PATH
. Jeśli chcesz wymagać pliku względnego w stosunku do aktualnie wykonywanego pliku zamiast z pliku$LOAD_PATH
, użyjrequire_relative
.źródło
Chciałbym polecić,
Zakładając, że wiesz, że plik znajduje się w tym samym katalogu roboczym.
Jeśli próbujesz wymagać tego względem pliku, możesz użyć
Mam nadzieję, że to pomoże.
źródło
Inną fajną metodą jest dołączenie bieżącego katalogu do ścieżki ładowania za pomocą
Możesz wrzucić go do tablicy $: ($ LOAD_PATH), ale cofnięcie zmiany wymusi załadowanie twojego bieżącego katalogu roboczego przed resztą ścieżki ładowania.
Po dodaniu bieżącego katalogu do ścieżki ładowania nie musisz określać dalej
i po prostu wrócić do używania
źródło
Będzie to dobrze działać, jeśli znajduje się w katalogu gem lib, a to jest tokenizer.rb
źródło
Użyłem jruby-1.7.4 do skompilowania mojego kodu ruby.
to kod, który spowodował poniższy błąd.
Usunąłem rb z wymagania i dałem
Działało dobrze.
źródło
Dla tych, którzy są absolutnie pewni, że ich ścieżka względna jest poprawna, moim problemem było to, że moje pliki nie miały
.rb
rozszerzenia! (Chociaż kiedyśRubyMine
tworzyłem pliki i zaznaczyłem, że były toRuby
pliki podczas tworzenia).Dokładnie sprawdź rozszerzenia plików w swoim pliku!
źródło
A co z włączeniem bieżącego katalogu do ścieżki wyszukiwania?
źródło
Problem polega na tym,
require
że nie ładuje się z bieżącego katalogu. Tak też myślałem, ale potem znalazłem ten wątek . Na przykład wypróbowałem następujący kod:Jak widać, odczytał plik ok, ale nie mogłem tego wymagać (ścieżka nie została rozpoznana). a oto kod, który działa:
Jak widać, jeśli podasz pełną ścieżkę, plik zostanie załadowany poprawnie.
źródło
Pierwszy :
Powinieneś także wprowadzić swoje hasło
Następnie :
Pojawia się Aktualizacja rubygems-update BŁĄD: Podczas wykonywania gem ... (OpenSSL :: SSL :: SSLError) nazwa hosta "gems.ruby-china.org" nie jest zgodna z certyfikatem serwera
Następnie:
Ostatni Jakiego języka chcesz używać? [Swift / ObjC]
Czy chcesz dołączyć aplikację demonstracyjną do swojej biblioteki? [ Tak nie ]
Z jakich frameworków testowych będziesz korzystać? [Specta / Kiwi / None]
Czy chcesz przeprowadzić testy w oparciu o widok? [ Tak nie ]
Jaki jest przedrostek twojej klasy?
Uruchamianie instalacji pod w nowej bibliotece.
źródło
musisz wskazać ścieżkę. Przynajmniej powinieneś podać ścieżkę z bieżącego katalogu. Na pewno zadziała. ./Nazwa pliku
źródło