Что главное в Ruby?

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

class X
end
x = X.new

Что за штука звонит "X.new"?

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


person lorz    schedule 27.05.2009    source источник
comment
Я чувствую, что этот вопрос может выиграть от контекста этого: stackoverflow.com/questions/916795   -  person mipadi    schedule 28.05.2009
comment
Спросил тот же человек. ржу не могу   -  person Randolpho    schedule 28.05.2009


Ответы (5)


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

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

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

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

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

person Chuck    schedule 27.05.2009
comment
В некоторых других ответах говорится, что интерпретатор ruby ​​вызывает новый метод. Но я думаю, вы говорите, что есть промежуточный шаг, прежде чем это произойдет. И это то, что создается экземпляр объекта, и все выполнение осуществляется через этот объект. На самом деле я просто пытаюсь заполнить пробелы в своем понимании того, как новый метод передается как сообщение объекту X. Из того, что вы говорите, кажется, что основной (экземпляр объекта) передает новый метод в качестве сообщения экземпляру класса X. Я приближаюсь? - person lorz; 28.05.2009
comment
Ну, я думаю, технически вы можете сказать, что это интерпретатор Ruby, который делает все, поскольку именно он фактически выполняет ваш код. Но с точки зрения языка да, ваше описание звучит совершенно правильно. На верхнем уровне, когда вы впервые начинаете печатать в Ruby, вы находитесь в контексте этого объекта. Большинство людей не используют верхний уровень как объект, но это так. - person Chuck; 28.05.2009
comment
@steel Знаете ли вы, где задокументировано это волшебное поведение? - person Jonah; 18.05.2020
comment
С точки зрения языка? С точки зрения Smalltalk? Возможно, да, отправителем является объект main. Не уверен, и не уверен, насколько применимо все это здесь. Конечно, Ruby находится под влиянием Smalltalk. Но чтобы отправить сообщение явно, мы делаем X.send(:new), а не send(X, :new). Ни то, ни другое в Smalltalk. И у нас есть метод caller, а не sender. Поэтому я думаю, что использование Smalltalk надумано. И это термины, которые я предлагаю обдумать. main — звонящий. main вызывает метод new в классе X. - person x-yuri; 28.05.2021
comment
Я чувствую, что без другого вопроса/ответа этот вопрос имеет меньше смысла. - person x-yuri; 28.05.2021

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

Попробуйте эту рубиновую программу:

p self
p self.class
person Igor Krivokon    schedule 27.05.2009

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

  • создает новый класс X, который является подклассом Object и автоматически (как подкласс Object) наследует некоторые методы, одним из которых является new.
  • устанавливает имя x
  • вызывает метод new для этого нового класса X, создавая объект экземпляра X; x получает ссылку на этот объект.
person Charlie Martin    schedule 27.05.2009

Это рубиновый интерпретатор, работающий на линии

x = X.new

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

person workmad3    schedule 27.05.2009
comment
Да, я думаю, что человек, задавший этот вопрос, имел в виду main с точки зрения программиста на C. Все остальные здесь, кажется, думают об объекте верхнего уровня с именем main в Ruby, что не совсем одно и то же. - person Ajedi32; 01.07.2015

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

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

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

person Tim Hoolihan    schedule 27.05.2009
comment
Делать ruby ​​-e ставит себя. Он напечатает main. Это объект контекста верхнего уровня. - person Chuck; 28.05.2009
comment
моя точка зрения заключалась в том, что вы не объявляете основной метод, как, казалось, подразумевал исходный постер в своем вопросе. - person Tim Hoolihan; 28.05.2009