Saya punya satu file, main.rb dengan konten berikut:
require "tokenizer.rb"
File tokenizer.rb berada di direktori yang sama dan kontennya adalah:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Jika saya mencoba menjalankan main.rb saya mendapatkan kesalahan berikut:
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>'
Saya hanya memperhatikan bahwa jika saya gunakan, load
bukannya require
semuanya bekerja dengan baik. Apa masalahnya di sini?
.rb
ekstensiJawaban:
Saya baru saja mencoba dan berfungsi dengan baik
require "./tokenizer"
. Semoga ini membantu.sumber
require_relative
seperti yang saya lakukan dalam jawaban saya.Lakukan saja ini:
Jika Anda meletakkan ini dalam file Ruby yang ada di direktori yang sama
tokenizer.rb
, itu akan berfungsi dengan baik apa pun direktori kerja Anda saat ini (CWD).Penjelasan mengapa ini adalah cara terbaik
Jawaban lain mengklaim bahwa Anda harus menggunakan
require './tokenizer'
, tetapi itu adalah jawaban yang salah , karena itu hanya akan berfungsi jika Anda menjalankan proses Ruby Anda di direktori yang sama dengan yangtokenizer.rb
ada. Cukup satu-satunya alasan untuk mempertimbangkan menggunakanrequire
seperti itu adalah jika Anda perlu mendukung Ruby 1.8, yang tidak adarequire_relative
.The
require './tokenizer'
jawaban mungkin bekerja untuk Anda hari ini, tetapi tidak perlu membatasi cara di mana Anda dapat menjalankan kode Ruby Anda. Besok, jika Anda ingin memindahkan file ke direktori lain, atau hanya ingin memulai proses Ruby Anda dari direktori lain, Anda harus memikirkan kembali semuarequire
pernyataan itu.Menggunakan
require
untuk mengakses file yang berada di jalur pemuatan adalah hal yang baik dan permata Ruby selalu melakukannya. Tetapi Anda tidak harus memulai argumenrequire
dengan.
kecuali Anda melakukan sesuatu yang sangat istimewa dan tahu apa yang Anda lakukan.Ketika Anda menulis kode yang membuat asumsi tentang lingkungannya, Anda harus berpikir dengan hati-hati tentang asumsi yang akan dibuat. Dalam hal ini, ada hingga tiga cara berbeda untuk memerlukan
tokenizer
file, dan masing-masing membuat asumsi yang berbeda:require_relative 'path/to/tokenizer'
: Diasumsikan bahwa jalur relatif antara dua file sumber Ruby akan tetap sama.require 'path/to/tokenizer'
: Menganggap bahwapath/to/tokenizer
ada di dalam salah satu direktori di jalur pemuatan ($LOAD_PATH
). Ini biasanya memerlukan pengaturan tambahan, karena Anda harus menambahkan sesuatu ke jalur pemuatan.require './path/to/tokenizer'
: Menganggap bahwa jalur relatif dari direktori kerja proses Ruby saat ini ketokenizer.rb
akan tetap sama.Saya pikir bahwa bagi kebanyakan orang dan sebagian besar situasi, asumsi yang dibuat dalam opsi # 1 dan # 2 lebih mungkin berlaku seiring berjalannya waktu.
sumber
Ruby 1.9 telah menghapus direktori saat ini dari jalur pemuatan, jadi Anda harus melakukan persyaratan relatif pada file ini, seperti yang dikatakan David Grayson:
Tidak perlu untuk membuatnya sufiks
.rb
, karena Ruby cukup pintar untuk mengetahui apa yang Anda maksudkan.sumber
Ruby 1.9 has removed the current directory from the load path
? Apa direktori saat ini dan jalur muat? Terima kasih.require_relative
. Besok dia mungkin mengetikcd ..
dan kemudianruby folder/main.rb
dan sedih solusi Anda tidak bekerja lagi. Saya tidak berpikir bahwa menggunakanrequire
memiliki manfaat apa pun di sini.require_relative
(yang tidak ada, atau saya tidak tahu tentang itu, pada saat posting)require
memuat file dari$LOAD_PATH
. Jika Anda ingin memerlukan file relatif terhadap file yang sedang dijalankan bukan dari$LOAD_PATH
, gunakanrequire_relative
.sumber
Saya ingin merekomendasikan,
Mengingat, Anda tahu file itu di direktori kerja yang sama.
Jika Anda mencoba untuk membuatnya relatif terhadap file, Anda dapat menggunakannya
Saya harap ini membantu.
sumber
Metode kecil yang bagus adalah dengan menyertakan direktori saat ini di jalur beban Anda
Anda bisa mendorongnya ke array $: ($ LOAD_PATH) tetapi unshift akan memaksanya untuk memuat direktori Anda saat ini sebelum sisa jalur muat.
Setelah Anda menambahkan direktori Anda saat ini di jalur muat Anda, Anda tidak perlu terus menentukan
dan bisa kembali menggunakan
sumber
Ini akan bekerja dengan baik jika berada di direktori lib permata dan ini adalah tokenizer.rb
sumber
Saya menggunakan jruby-1.7.4 untuk mengkompilasi kode ruby saya.
adalah kode yang melemparkan kesalahan di bawah ini.
Saya menghapus rb dari keharusan dan memberi
Itu bekerja dengan baik.
sumber
Bagi mereka yang benar-benar yakin jalur relatif mereka benar, masalah saya adalah bahwa file saya tidak memiliki
.rb
ekstensi! (Meskipun saya duluRubyMine
membuat file dan memilihnya sebagai file yang sedangRuby
dibuat.)Periksa ekstensi file pada file Anda!
sumber
Bagaimana dengan memasukkan direktori saat ini di jalur pencarian?
sumber
Masalahnya adalah itu
require
tidak memuat dari direktori saat ini. Ini adalah apa yang saya pikirkan, tetapi kemudian saya menemukan utas ini . Misalnya saya mencoba kode berikut:Seperti dapat dilihat membaca file ok, tapi saya tidak bisa memerlukannya (path tidak dikenali). dan begini kode yang berfungsi:
Seperti yang Anda lihat jika Anda menentukan path lengkap file dimuat dengan benar.
sumber
Pertama:
Dan, Anda harus memasukkan kata sandi Anda
Kemudian :
Muncul Memperbarui rubygems-update ERROR: Ketika menjalankan permata ... (OpenSSL :: SSL :: SSLError) nama host "gems.ruby-china.org" tidak cocok dengan sertifikat server
Kemudian:
Terakhir Bahasa apa yang ingin Anda gunakan ?? [Swift / ObjC]
Apakah Anda ingin menyertakan aplikasi demo dengan perpustakaan Anda? [ Ya Tidak ]
Kerangka kerja pengujian mana yang akan Anda gunakan? [Specta / Kiwi / Tidak Ada]
Apakah Anda ingin melakukan pengujian berbasis tampilan? [ Ya Tidak ]
Apa awalan kelas Anda?
Menjalankan pemasangan pod di perpustakaan baru Anda.
sumber
Anda harus memberi jalan. Setidaknya Anda harus memberikan path dari direktori saat ini. Pasti akan berhasil. ./nama file
sumber