Почему Ruby использует nil для обозначения нулевого объекта?

Googled, но не нашел ответа.

Есть ли что-то особенное в имени nil?

Является ли понятие nil отличным от null в других языках?

Ответ 1

Ну, "ноль" - это традиционное название для переопределенной концепции "ничего" в Lisp и Smalltalk †. Слово "null" используется как прилагательное, означающее "пусто", как в "нулевом списке", которое равно нулю.

Между тем, "null" традиционно является значением указателя в C, что означает, что указатель не указывает на что-либо действительное. Это относится к тому, что указатель имеет нулевое значение (в том же смысле, что Lisp использует это слово), но сам по себе он считался значением.

Мац был поклонником как Smalltalk, так и Lisp, поэтому он пошел со своей терминологией. Между этими двумя терминами нет существенного различия в значении - один - только C-ish.

Собственно, "nil" существовало на гораздо большем количестве языков, чем только те. Даже Алгол-68, великий дедушка С, назвал его "ноль". Я не уверен, что C изобрел "нуль" как имя для нулевой ссылки или просто популяризировал его, но я уверен, что все современные языки, использующие этот термин, получили его от C.

Ответ 2

Многие языки программирования имеют возможность представить отсутствие информации. Иногда вы увидите null, иногда, nil, а в Python - None.

Нет универсальной разницы между nil и null и None. Интересен тот факт, что существуют различия в том, как разные языки используют null, например: на некоторых языках его можно использовать только в контексте указателя; иногда это ключевое слово; иногда это просто идентификатор; иногда это примитив; иногда это объект.

Но нет ничего, что говорит о том, что вы должны использовать nil для обозначения этого и null для обозначения этого.

Выбор слова, означающего ничего, зависит от разработчика языка. Мацумото предпочел nil; это все.

FWIW, некоторые языки идут на один шаг дальше и отличают концепцию ничего от концепции, о которой мне все равно. Напомним, что JavaScript здесь:

var supervisor = null;       // I definitely do NOT have a supervisor.

var supervisor = undefined;  // I may or may not have supervisor.  I may or may not
                             // even know if I do.  Or it is not relevant.  Or it is
                             // none of your business.

Разработчики языка могут или не могут использовать это различие на своем языке. Я никогда не видел ничего подобного для null vs. nil.

Ответ 3

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

Существует символ ASCII с именем null. Это двоичное значение 00000000. Это фактический символ. Мы обычно спрашивали: "нулевой символ действительно null?".

Мое предложение, которое является изменением ума для меня, заключается в том, чтобы зарезервировать слово null для нулевого символа и использовать nil, когда значение "ничего".

Исторически: мы использовали отправку пучка нулей в какое-то место, чтобы создать паузу при отправке данных.