Есть ли "основной" метод в Ruby, как в C? - PullRequest
37 голосов
/ 13 марта 2012

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

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

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

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

[- EDIT -]

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

def callTest1
    puts "in test 1"
end

def callTest2
    puts "in test 2" 
end

callTest1
callTest2

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

Еще раз спасибо всем, кто откликнулся.

Ответы [ 5 ]

37 голосов
/ 13 марта 2012

@ Ответ Хаулета правильный: в 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 - отличное чтение:)

22 голосов
/ 13 марта 2012

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

puts 'Hello World'

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

if __FILE__ == $0
  # your code
end

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

6 голосов
/ 14 марта 2012

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

class Foo
  p self
end
#=> Foo

p self
#=> main

def foo 
  p self
end
foo
#=> main
1 голос
/ 13 марта 2012

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

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

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

1 голос
/ 13 марта 2012

В Ruby нет магической главной функции. Смотри http://en.wikipedia.org/wiki/Main_function#Ruby

...