Что такое «главное» в Ruby? - PullRequest
42 голосов
/ 28 мая 2009

Если я запускаю этот файл как "ruby x.rb":

class X
end
x = X.new

Что это за вещь, которая называет "X.new"?

Это объект / процесс / и т. Д.?

Ответы [ 5 ]

49 голосов
/ 28 мая 2009

Все в Ruby происходит в контексте некоторого объекта. Объект на верхнем уровне называется «основным». Это в основном экземпляр Object со специальным свойством, которое любые методы, определенные там, добавляются как методы экземпляра Object (поэтому они доступны везде).

Таким образом, мы можем сделать скрипт, состоящий полностью из:

puts object_id
@a = 'Look, I have instance variables!'
puts @a

и будет напечатано «105640» и «Смотри, у меня есть переменные экземпляра!».

Это не то, что вам обычно нужно беспокоиться, но оно есть.

12 голосов
/ 28 мая 2009

Вызывающий объект верхнего уровня - это объект main, который относится к классу Object.

Попробуйте эту программу ruby:

p self
p self.class
3 голосов
/ 28 мая 2009

Это Х класс. Вы вызываете метод «new», который создает объект класса X. Итак, если вы запускаете этот текст как скрипт, Ruby:

  • создает новый класс X, который является подклассом Object, и который автоматически (как подкласс Object) наследует некоторые методы, одним из которых является new.
  • устанавливает имя x
  • вызывает метод new для этого нового класса X, создавая объект экземпляра X; x получает ссылку на этот объект.
2 голосов
/ 28 мая 2009

Это переводчик ruby, выполняющий строку

x = X.new

Как и во многих языках сценариев, сценарий интерпретируется сверху вниз, а не имеет стандартного метода точки входа, как большинство компилируемых языков.

1 голос
/ 28 мая 2009

Как сказал Чарли Мартин, X.new - это вызов конструктора класса X, который возвращает объект типа X, хранящийся в переменной x.

Исходя из вашего названия, я думаю, вы ищете немного больше. Руби не нуждается в main, он выполняет код в том порядке, в котором он его видит. Таким образом, зависимости должны быть включены до их вызова.

Таким образом, ваш главный код - это любой процедурный код, написанный вне определения класса или модуля.

...