@ Ответ Хаулета правильный: в Ruby нет метода или структуры main
.Я просто хочу представить здесь немного другое представление вместе с некоторыми пояснениями.
Когда вы выполняете 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__ == $0
- это просто способ заблокировать код, который вы хотите запустить, только если этот файлзапускается прямо из командной строки.__FILE__
- это имя текущего файла, $0
- это команда, которая была выполнена оболочкой (хотя она достаточно умна, чтобы отбросить ruby
), поэтому сравнение этих двух типов точно говорит вам: это файл, которыйбыл выполнен из командной строки?Это иногда делается программистами, которые хотят определить класс / модуль в файле, а также предоставляют утилиту командной строки, которая его использует.ИМХО, это не очень хорошая структура проекта, но, как и все, есть варианты использования, в которых это имеет смысл.
Если вы хотите иметь возможность выполнять свой код напрямую, вы можете добавить shebang line
#!/usr/bin/env ruby
# rest of somefile.rb
и сделать его исполняемым с помощью chmod +x somefile.rb
(опционально переименовать его без расширения .rb).Это действительно не меняет вашу ситуацию.if __FILE__ == $0
все еще работает и, вероятно, по-прежнему не нужен.
Edit
Как правильно указывает @steenslag, область действия верхнего уровня в Ruby - это Object
называется main
.Тем не менее, он выглядит немного странно:
irb
>> self
=> main
>> self.class
=> Object
>> main
NameError: undefined local variable or method `main' for main:Object
from (irb):8
Не беспокойтесь об этом, пока не начнете копать глубже в язык.Если вы do хотите больше узнать о подобных вещах, Metaprogramming Ruby - отличное чтение:)