Ruby แยกไฟล์ต้นฉบับขนาดใหญ่ออกเป็นหลายไฟล์

ฉันกำลังเขียนสคริปต์ Ruby ซึ่งควรจะเป็นสิ่งเล็กๆ แต่มีขนาดค่อนข้างใหญ่ จนถึงใหญ่จนทำให้ทุกอย่างอัดแน่นอยู่ในไฟล์ต้นฉบับเดียว ดังนั้นฉันจึงพยายามแยกโปรเจ็กต์ออกเป็นไฟล์ต่างๆ ฉันมีสี่คลาสและฉันต้องการแยกแต่ละคลาสไว้ในไฟล์ต้นฉบับแยกกัน

สิ่งที่ฉันทำ:

ฉันย้ายคลาสทั้งหมดไปไว้ในไฟล์ของตัวเอง ตอนนี้ฉันมีสิ่งนี้แล้ว

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

ตอนนี้พวกมันอยู่ในไฟล์อื่นแล้ว ฉันได้รับ uninitialized constant GoogleChart (NameError) ในคลาสย่อยทั้งหมดของฉันในบรรทัดที่ฉันสืบทอดจาก GoogleChart เช่น

require 'GoogleChart'
BarChart < GoogleChart

ใครสามารถบอกฉันว่ามีอะไรผิดปกติ?

ขอบคุณ

แก้ไข

ใช้ Ruby เวอร์ชัน 1.8.4

ฉันได้ลองใช้เส้นทางที่แน่นอนแล้วด้วย:

require 'C:/Documents and Settings/proj/GoogleChart.rb' และนี่ยังคงสร้าง NameError


person Hunter McMillen    schedule 15.08.2011    source แหล่งที่มา
comment
คุณใช้โมดูลเพื่อสร้างเนมสเปซด้วยหรือไม่ มี GoogleChart.rb ตัวที่ 2 หรือไม่ (หรืออีกนัยหนึ่ง: คุณแน่ใจหรือว่าโหลด GoogleChart.rb ที่ถูกต้อง - บางที need_relative จะดีกว่า)   -  person knut    schedule 15.08.2011
comment
ฉันควรจะกล่าวข้างต้น เวอร์ชัน Ruby ที่เรามีคือ 1.8.4 ดังนั้น require_relative ไม่ใช่ตัวเลือก   -  person Hunter McMillen    schedule 15.08.2011
comment
สิ่งที่ไม่สมเหตุสมผลคือการพยายามต้องการเส้นทางที่แน่นอนไม่ทำงาน require C:/Document and Settings/proj/BarChart.rb ยังคงส่งคืน NameError   -  person Hunter McMillen    schedule 15.08.2011


คำตอบ (1)


ใน Ruby 1.8.x นั้น . เป็นส่วนหนึ่งของเส้นทางการโหลดของคุณ ดังนั้นอย่างน้อยคุณควรพยายามแก้ไขจุดบกพร่องนั้นโดยรวมสิ่งที่ชอบ:

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

และโหลดสิ่งนั้นในเซสชัน IRB:

  1. เปิดเซสชันในไดเรกทอรีของคุณ proj
  2. เข้าไปที่นั่น require 'BarChart'
  3. ดูผลลัพธ์สิ

สำหรับฉันมันคือ:

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

ดังนั้นความต้องการจึงสำเร็จสำหรับฉัน และ . ก็เป็นส่วนหนึ่งของเส้นทาง (เท่าที่ควร) อย่างที่คุณเห็น ฉันกำลังทำงานกับ Ruby 1.8.7 ฉันไม่รู้ว่ามีอะไรเปลี่ยนแปลงไปหรือไม่ตั้งแต่ 1.8.4 ที่เกี่ยวข้องกับที่นี่

ดังนั้นโปรดอธิบายอย่างชัดเจนว่าคุณเรียกใช้ไฟล์ของคุณอย่างไร:

  • คุณได้เปิดเชลล์เพื่อรันไฟล์หรือไม่?
  • ไดเร็กทอรีการทำงานปัจจุบันของเชลล์นั้นคืออะไร?
  • คุณเรียกใช้โดยดับเบิลคลิกหรือไม่?

มันจะใช้งานได้เฉพาะเมื่อคุณอยู่ในไดเร็กทอรี proj และรันที่นั่น (โดยมี ruby ​​ในพาธเชลล์ของคุณ) ruby BarChart.rb

person mliebelt    schedule 15.08.2011
comment
นั่นก็ประสบความสำเร็จสำหรับฉันแบบโต้ตอบด้วย และ . เป็นส่วนหนึ่งของเส้นทางการโหลดของฉัน: 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| . แต่ด้วยเหตุผลบางอย่าง มันไม่ทำงานเมื่อฉันไปเรียกใช้ไฟล์ - person Hunter McMillen; 15.08.2011
comment
เพิ่มวิธีการเรียกใช้ไฟล์ Ruby ในตอนท้าย โปรดตรวจสอบด้วยเช่นกัน - person mliebelt; 15.08.2011
comment
ฉันได้รับ NameError เมื่อฉันเรียกใช้จากเชลล์และจาก SciTE - person Hunter McMillen; 15.08.2011
comment
คุณได้ลองย้ายไฟล์โครงการไปยังไดเร็กทอรีที่ไม่มีช่องว่างในเส้นทางหรือไม่? เป็นเพียงการคาดเดาอย่างบ้าคลั่งดังนั้น ... - person mliebelt; 15.08.2011