Есть ли" основной " метод в Ruby, как в C?
Я новичок в Ruby, поэтому извиняюсь, если это звучит действительно глупо.
Я не могу понять, как написать "основной" код и иметь методы в одном файле (аналогично C). Я заканчиваю с" основным " файлом, который загружает отдельный файл, который имеет все методы. Я ценю любые указания на этот счет.
Я заметил следующее сообщение SO, но я его не понимаю: должен ли я определить основной метод в моих сценариях ruby?
пока это не большое дело, просто проще видеть весь соответствующий код в одном файле. Спасибо.
[- EDIT -]
спасибо всем, кто ответил-оказывается, вам просто нужно определить все методы выше кода. Ниже приведен пример:
def callTest1
puts "in test 1"
end
def callTest2
puts "in test 2"
end
callTest1
callTest2
Я думаю, что это имеет смысл, поскольку Ruby должен знать все методы заранее. Это не похоже на C, где есть файл заголовка, который четко перечисляет доступные функции и, следовательно, может определить их под основным() функция
еще раз, спасибо всем, кто откликнулся.
5 ответов
@Hauleth's ответ правильный: нет main
метод или структура в Ruby. Я просто хочу представить здесь немного другой взгляд вместе с некоторым объяснением.
при выполнении ruby somefile.rb
, Ruby выполняет весь код в somefile.rb
. Поэтому, если у вас есть очень маленький проект и вы хотите, чтобы он был автономным в одном файле, нет абсолютно ничего плохого в том, чтобы сделать что-то вроде этого:
# somefile.rb
class MyClass
def say_hello
puts "Hello World"
end
end
def another_hello
puts "Hello World (from a method)"
end
c = MyClass.new
c.say_hello
another_hello
дело не в том, что первые два блока не выполняются, просто вы не видите эффектов, пока не используете соответствующий класс/метод.
на if __FILE__ ==
bit-это просто способ заблокировать код, который вы хотите запустить, только если этот файл запускается непосредственно из командной строки. __FILE__
имя текущего файла, - это команда, которая была выполнена оболочкой (хотя она достаточно умна, чтобы отбросить
ruby
), поэтому сравнение двух говорит вам точно, что: это файл, который был выполнен из команды линия? Это иногда делают кодеры, которые хотят определить класс / модуль в файле, а также предоставить утилиту командной строки, которая его использует. IMHO это не очень хорошая структура проекта, но, как и все, есть случаи использования, когда это имеет смысл.
если вы хотите иметь возможность выполнять свой код напрямую, вы можете добавить shebang строка
#!/usr/bin/env ruby
# rest of somefile.rb
и сделать его исполняемым с chmod +x somefile.rb
(при необходимости переименуйте его без .расширением РБ). Это не меняет твою ситуацию. The if __FILE__ ==
все еще работает и все еще, вероятно, не требуется.
редактировать
как правильно указывает @steenslag, область верхнего уровня в Ruby является Object
под названием main
. Он имеет немного фанки поведение, хотя:
irb
>> self
=> main
>> self.class
=> Object
>> main
NameError: undefined local variable or method `main' for main:Object
from (irb):8
не беспокойтесь об этом, пока не начнете копать гораздо глубже в язык. Если ты ... --35-- > do хотите узнать больше о таких вещах, Метапрограммирование В Ruby отличное чтение:)
нет такой структуры. Конечно, вы можете определить основную функцию, но она не будет вызываться, пока вы этого не сделаете. Ruby выполняет строку за строкой, поэтому, если вы хотите напечатать "Hello World", вы просто напишите:
puts 'Hello World'
вопрос, который вы упомянули, касается использования одного файла в качестве модуля и исполняемого файла, поэтому, если вы пишете
if __FILE__ ==
# your code
end
он будет вызываться только при запуске этого файла. Если вам требуется только в другом файле, этот код никогда не будет запущен. Но ИМХО это плохая идея, лучше опция использует RubyGems и добавляет исполняемые файлы.
на самом деле есть main
, но это не метод; это объект верхнего уровня, который является начальным контекстом выполнения программы Ruby.
class Foo
p self
end
#=> Foo
p self
#=> main
def foo
p self
end
foo
#=> main
в Ruby нет основной функции magic. См.http://en.wikipedia.org/wiki/Main_function#Ruby
Если вы хотите запустить Ruby скрипты, такие как скомпилированные файлы C, сделайте следующее:
#!/usr/bin/env ruby
puts "Hello"
а то chmod a+x file_name.rb
. Все, что находится ниже первой строки, будет запущено, как если бы это было содержимое main
В C. Конечно, определения классов и функций не дадут вам никаких результатов, пока они не будут созданы/вызваны (хотя код внутри определений классов фактически оценивается, поэтому вы можете получить некоторый результат, но это не ожидается в нормальных обстоятельствах).