Ruby разделяет большие исходные файлы на несколько файлов

Я пишу сценарий Ruby, который должен был быть небольшим, но стал довольно большим, слишком большим, чтобы все было втиснуто в один исходный файл. Поэтому я пытаюсь разделить проект на разные файлы. У меня есть четыре класса, и я хочу поместить каждый в отдельный исходный файл.

Что я сделал:

Я переместил все классы в их собственные файлы, так что теперь у меня есть это

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

Теперь, когда они находятся в других файлах, я получаю uninitialized constant GoogleChart (NameError) во всех своих подклассах в строке, где я наследую от GoogleChart, т.е.

require 'GoogleChart'
BarChart < GoogleChart

Кто-нибудь может сказать мне, что не так?

Спасибо

ИЗМЕНИТЬ

Использование рубиновой версии 1.8.4

Также я пробовал использовать абсолютный путь:

require 'C:/Documents and Settings/proj/GoogleChart.rb' и это все еще производит NameError


person Hunter McMillen    schedule 15.08.2011    source источник
comment
Используете ли вы также модули для создания пространств имен? Есть ли второй GoogleChart.rb (или, другими словами: вы уверены, что загружаете правильный GoogleChart.rb - может быть, require_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