Есть ли" основной " метод в 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. Конечно, определения классов и функций не дадут вам никаких результатов, пока они не будут созданы/вызваны (хотя код внутри определений классов фактически оценивается, поэтому вы можете получить некоторый результат, но это не ожидается в нормальных обстоятельствах).