Почему () возвращает ноль в Ruby?

В Ruby при запуске:

()
=> nil

Выход nil. Я не понимаю, какой механизм Ruby используется.

Я думал, что это вызывает self(), но self() возвращает syntax error, unexpected '(', expecting end-of-input.

Почему это возвращает nil и какая языковая функция используется?

self — это объект. self() запрашивает метод с именем self, которого не существует. () — это не вызов метода, это просто группировка «ничего», которая обрабатывается как nil.
tadman 24.01.2019 19:18
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
3
1
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

«Нет значения» трактуется как nil во многих местах Ruby:

-> { break }.()
#⇒ nil

42 if false
#⇒ nil

То же самое и здесь: круглые скобки избыточны, но они сохраняют блок кода, пустой, поэтому он обрабатывается как nil.


В Ruby 2.6+ вы можете сами проверить AST:

main > RubyVM::AbstractSyntaxTree.parse('()')
#⇒ (SCOPE@1:0-1:2 tbl: [] args: nil body: (BEGIN@1:1-1:1 nil))

сори, не смогла пройти мимо :)

Sergio Tulentsev 24.01.2019 17:42

Значит, это то же самое, что и begin; end?

Vinicius Brasil 24.01.2019 17:55

Строго говоря, не совсем так, поскольку begin end объявляет блок кода, а скобки — нет. Но поведение и причина возврата nil одинаковы, да.

Aleksei Matiushkin 24.01.2019 17:57

Я думаю, что () объявляет блок кода, не так ли? repl.it/repls/FrozenVibrantRuntimes

Vinicius Brasil 24.01.2019 18:06

О, действительно, вы правы. Плохо, я на самом деле никогда не знал об этом.

Aleksei Matiushkin 24.01.2019 18:16

Другие вопросы по теме