Есть ли "основной" метод в Ruby, как в C?

Я новичок в Ruby, поэтому извиняюсь, если это звучит глупо.

Я не могу понять, как написать "главный" код и иметь методы в одном файле (аналогично C). Я получаю "основной" файл, который загружает отдельный файл, который имеет все методы. Я ценю любые рекомендации по этому поводу.

Я заметил следующий пост SO, но я этого не понимаю: Должен ли я определить основной метод в моих рубиновых скриптах?

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

[- РЕДАКТИРОВАТЬ -]

Спасибо всем, кто ответил - оказывается, вам просто нужно определить все методы выше кода. Ниже приведен пример:

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

Я думаю, что это имеет смысл, поскольку Ruby должен знать все методы заранее. Это не похоже на C, где есть заголовочный файл, который четко перечисляет доступные функции и поэтому может определять их под функцией main()

Снова, спасибо всем, кто ответил.

Ответ 1

@Правильный ответ правильный: в 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

#!/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

Не беспокойтесь об этом, пока не начнете копать гораздо глубже в язык. Если вы хотите узнать больше об этом, Метапрограммирование Ruby отлично читает:)

Ответ 2

Нет такой структуры. Конечно, вы можете определить основную функцию, но она не будет вызываться, пока вы этого не сделаете. Ruby выполняются строчными строками, поэтому, если вы хотите напечатать "Hello World", вы просто пишете:

puts 'Hello World'

Вопрос, который вы упомянули, касается использования одного файла в качестве модуля и исполняемого файла, поэтому, если вы пишете

if __FILE__ == $0
  # your code
end

Он будет вызываться только при запуске этого файла. Если вы требуете его только в другом файле, этот код никогда не будет запущен. Но IMHO это плохая идея, лучший вариант - использование RubyGems и добавление исполняемых файлов.

Ответ 3

На самом деле существует main, но это не метод; это объект верхнего уровня, который является исходным контекстом выполнения программы Ruby.

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main

Ответ 5

Если вы хотите запускать скрипты Ruby, такие как скомпилированные файлы C, выполните следующие действия:

#!/usr/bin/env ruby
puts "Hello"

а затем chmod a+x file_name.rb. Все, что находится ниже первой строки, будет запущено, как если бы это было содержимое main в C. Конечно, определения классов и функций не дадут вам никаких результатов до тех пор, пока они не будут созданы или вызваны (хотя определения кода внутри класса на самом деле оценивается, поэтому вы можете получить некоторый результат, но это не ожидается в обычных обстоятельствах).