Вызов другого рубинового файла, который не является самоцветом - PullRequest
6 голосов
/ 20 декабря 2010

Я хочу создать статический класс ruby ​​с библиотекой функций.Я на Vista с ruby ​​1.9.2

Мой класс такой:

class TestClass

  def say_hello
    puts "say hello"
  end
end

в файле TestClass.rb (я предполагаю, что я прав, так как все учебники по ruby ​​наполный беспорядок, помещающий все в одну магическую вещь (файл?), как будто IRB был началом и концом всего этого.)

Мой рубин main() (да, я из Java) или запись программы или watheverэто называется в ruby:

require 'TestClass.rb'

puts "start"
say_hello

Но это не с:

C:\ruby_path_with_all_my_classes>ruby classuser.rb
<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
 TestClass.rb (LoadError)
    from <internal:lib/rubygems/custom_require>:29:in `require'
    from classuser.rb:1:in `<main>'

Как это работает?Можно ли вызывать другие файлы в Ruby или вы попали в один файл, содержащий все ваши классы?

Ответы [ 3 ]

15 голосов
/ 20 декабря 2010

Файл TestClass находится в том же каталоге?Сделайте файл TestClass.rb строчным и загрузите его с

require './testclass'

без необходимости .rb

Я бы предложил поместить любые классы в папку lib.Тогда вам потребуется файл следующим образом:

require './lib/testclass'
13 голосов
/ 20 декабря 2010

В 99% всех случаев, когда компьютер говорит вам, что он не может найти вещь, это происходит потому, что ее там нет.Итак, первое, что вам нужно проверить, это то, действительно ли является файлом с именем TestClass.rb где-то в вашей файловой системе.

В 99% остальных случаи, компьютер ищет не в том месте.(Ну, на самом деле, компьютер обычно ищет в нужном месте, но то, что он ищет, находится не в том месте).require загружает файл из $LOAD_PATH, поэтому вы должны убедиться, что каталог, в котором находится файл TestClass.rb, на самом деле - это на $LOAD_PATH.

В качестве альтернативы, если вы не хотите require файл из $LOAD_PATH, а скорее относительно позиции файла, который делает require ing, тогда вам нужно использовать require_relative.

Обратите внимание, однако, что ваш код все равно не будет работать, поскольку say_hello является экземпляром метода экземпляров класса TestClass, но вы вызываете его для объекта main, которыйэкземпляр Object, а не TestClass.

Обратите также внимание, что стандартными соглашениями об именах файлов Ruby являются snake_case, в частности, версия snake_case основного класса / модуля файла.Итак, в вашем случае файл должен называться test_class.rb.Кроме того, require и require_relative определят правильное расширение файла для себя, поэтому вам следует пропустить .rb.И в-третьих, стандартный стиль кодирования Ruby - это два пробела для отступа, а не четыре.

Ничто из этого не приведет к тому, что ваш код не будет работать, конечно, поскольку он чисто стилистический, но он может люди могут не захотеть отвечать на ваши вопросы, поскольку это показывает, что вы недостаточно уважаете их сообщество, чтобы выучить даже самые простые правила.

2 голосов
/ 20 декабря 2010

Попробуйте использовать

require './TestClass.rb'

Связано: Ruby: require vs require_relative - передовой метод для обхода обхода в Ruby <1.9.2 и> = 1.9.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...