Ruby memisahkan file sumber besar menjadi beberapa file

Saya sedang menulis skrip Ruby yang seharusnya berukuran kecil tetapi telah berkembang cukup besar, sangat besar sehingga semuanya dijejalkan ke dalam satu file sumber. Jadi saya mencoba memisahkan proyek menjadi file yang berbeda. Saya memiliki empat kelas dan saya ingin menempatkan masing-masing kelas dalam file sumbernya yang terpisah.

Apa yang saya lakukan:

Saya memindahkan semua kelas ke dalam file mereka sendiri jadi sekarang saya punya ini

proj/GoogleChart.rb
proj/BarChart.rb
proj/PieChart.rb
proj/GroupedBarChart.rb

Sekarang mereka ada di file lain, saya mendapatkan uninitialized constant GoogleChart (NameError) di semua subkelas saya di baris yang saya warisi dari GoogleChart, yaitu.

require 'GoogleChart'
BarChart < GoogleChart

Adakah yang bisa memberi tahu saya apa yang salah?

Terima kasih

EDIT

Menggunakan Ruby versi 1.8.4

Saya juga telah mencoba menggunakan jalur absolut:

require 'C:/Documents and Settings/proj/GoogleChart.rb' dan ini masih menghasilkan NameError


person Hunter McMillen    schedule 15.08.2011    source sumber
comment
Apakah Anda juga menggunakan Modul untuk membangun ruang nama? Apakah ada GoogleChart.rb ke-2 (atau dengan kata lain: apakah Anda yakin memuat GoogleChart.rb yang benar - mungkin require_relative akan lebih baik)   -  person knut    schedule 15.08.2011
comment
Saya seharusnya menyebutkan di atas, versi Ruby yang kami miliki adalah 1.8.4 jadi require_relative bukanlah suatu pilihan   -  person Hunter McMillen    schedule 15.08.2011
comment
Yang tidak masuk akal adalah bahkan mencoba meminta jalur absolut tidak berhasil. require C:/Document and Settings/proj/BarChart.rb masih mengembalikan NameError   -  person Hunter McMillen    schedule 15.08.2011


Jawaban (1)


Di Ruby 1.8.x, . adalah bagian dari jalur pemuatan Anda. Jadi, Anda setidaknya harus mencoba men-debugnya dengan memasukkan sesuatu seperti:

puts $:
require 'GoogleChart'
class BarChart < GoogleChart
end

dan memuatnya dalam sesi IRB:

  1. Buka sesi di direktori Anda proj.
  2. Masuk ke sana require 'BarChart'
  3. Lihatlah hasilnya.

Bagi saya itu adalah:

c:\apps\ruby\test\proj>irb
irb(main):001:0> require 'BarChart'
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/site_ruby/1.8
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/site_ruby/1.8/i386-msvcrt
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/site_ruby
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/vendor_ruby/1.8
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/vendor_ruby/1.8/i386-msvcrt
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/vendor_ruby
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/1.8
C:/Users/mliebelt/.pik/rubies/Ruby-187-p334/lib/ruby/1.8/i386-mingw32
.
=> true

Jadi persyaratannya berhasil bagi saya, dan . adalah bagian dari jalur (sebagaimana mestinya). Seperti yang Anda lihat, saya bekerja dengan Ruby 1.8.7, saya tidak tahu apakah ada yang berubah sejak 1.8.4 yang relevan di sini.

Jadi tolong jelaskan bagaimana Anda menjalankan file Anda:

  • Sudahkah Anda membuka shell untuk menjalankan file?
  • Apa direktori kerja shell itu saat ini?
  • Apakah Anda menjalankannya dengan mengklik dua kali?

Ini hanya berfungsi ketika Anda berada di direktori proj dan dijalankan di sana (dengan ruby ​​​​di jalur shell Anda) ruby BarChart.rb.

person mliebelt    schedule 15.08.2011
comment
Itu juga berhasil bagi saya secara interaktif, dan . adalah bagian dari jalur pemuatan saya: c:/ruby/lib/ruby/site_ruby/1.8| c:/ruby/lib/ruby/site_ruby/1.8/i386-msvcrt| c:/ruby/lib/ruby/site_ruby| c:/ruby/lib/ruby/1.8| c:/ruby/lib/ruby/1.8/i386-mswin32| . Tetapi karena alasan tertentu tidak berfungsi ketika saya menjalankan file - person Hunter McMillen; 15.08.2011
comment
Ditambahkan di akhir cara menjalankan file Ruby. Silakan periksa juga. - person mliebelt; 15.08.2011
comment
Saya mendapatkan NameError ketika saya menjalankan dari Shell dan dari SciTE - person Hunter McMillen; 15.08.2011
comment
Sudahkah Anda mencoba memindahkan file proyek ke direktori tanpa spasi di jalurnya? Hanya tebakan liar, jadi... - person mliebelt; 15.08.2011