Nil/ru
Зарезервированное слово nil представляет собой специальное значение переменной-указателя, не указывающей ни на что конкретное. В FPC это реализовано как pointer ( 0 ) (числовое значение 0 ), однако программист не должен использовать этот факт. На других языках программирования, например на C, кто-то пишет null . Термины “null pointer” или “nil pointer” используются взаимозаменяемо, даже среди программистов на Паскале.
Есть два популярных объяснения этимологии nil . Кто-то говорит: nil означает латинское слово «nihil», означающее «ничего». Другой предполагает, что NIL — это английская аббревиатура, обозначающая “not in list” (нет в списке). Может быть, поскольку немецкое слово «Null» обозначает цифру «ноль», чтобы избежать путаницы или для различия между понятием и значением, было выбрано слово nil . Во всяком случае, это не имеет никакой разницы при программировании.
Contents
- 1 Совместимость присвоения
- 2 Приложение
- 3 См.также
Совместимость присвоения
nil can be of course assigned to a pointer variable, but also to other types, which are in fact pointers, but their usage is more convenient. For instance dynamic arrays or classes:
Конечно, nil может быть присвоен переменной pointer , но также и другим типам, которые на самом деле являются указателями, но их использование более удобно. Например, динамические массивы или классы:
1program nilDemo(input, output, stderr); 2var 3 loc: pointer; 4 chk: array of boolean; 5 msg: PChar; 6 prc: TProcedure; 7 obj: TObject; 8begin 9 // указываем в никуда 10 loc := nil; 11 // очищаем динамический массив 12 chk := nil; 13 // очищаем строку 14 msg := nil; 15 // процедурная переменная не ссылается ни на одну процедуру 16 prc := nil; 17 // теряем ссылку на объект 18 obj := nil; 19end.
Обратите внимание, что присвоение nil динамическому массиву практически эквивалентно вызову процедуры setLength ( dynamicArrayVariable , 0 ) . Значения массива теряются, если счетчик ссылок dynamicArrayVariable достигает нуля. Однако не существует сопоставимого механизма для других типов, например, присвоение nil переменной class ‘а или pointer не освободит (т.е. де-аллокирует) память, которая, возможно, была занята ссылочной структурой.
Приложение
В манере Паскаля вы обычно не пишете такие выражения, как pointerVariable = nil , а используете более толковые идентификаторы. Шаблон system . assigned заменяется точно таким же выражением, но скрывает тот факт, что переменная (реализована как) указатель. Поэтому его использование не является обязательным.
Шаблон SysUtils . FreeAndNil будет вызывать шаблон класса free и присваивать nil передаваемому указателю (переменной типа class). Хотя это хорошая идея, очистить указатели, которые больше не указывают на допустимые объекты, это может усложнить отладку, так как нет доступного указателя, указывающего на адрес, которым был определенный объект.
См.также
- Оператор разыменования указателя ^
- Переменная system . returnNilIfGrowHeapFails
- Обнуляемые типы
Null, Nil и пустота
Теги: ios, foundation, nsnull, nsobject, null, nsobjcruntime.h, nil, ноль, ничего, objective c, alloc, assert, nsparameterassert, nsarray, `+null`, (void *)0, (id)0, (class)0, [nsnull null], мобильная разработка
Как мы можем представить программно «ничего»? Например, когда метод ожидает на вход объект, но его нет, а вызов происходит. В программах всё должно быть чётко и понятно, там нельзя сказать «Извините, ничего не пришло». В языках программирования отсутствие значения – тоже значение! Это означает, что мы можем сравнивать данные с этим «ничем», чтобы проверить: нам на вход был подан объект или подано его отсутствие. Objective C в этом плане не является исключением, так давайте рассмотрим это подробнее.
Всё бы ничего, да всё ничего
Для начала вспомним, что Objective C является расширением языка С («объектный Си»). Всё, что есть в С, есть и в Objective C. В языке С, уж простите за каламбур, используются два значения для отсутствия значения. Во-первых, это «0» для простых скалярных типов (int, char и т.д.). А во-вторых, для указателей используется ключевое слово NULL, которое, по сути, являет собой тот же «0» только в контексте работы с указателем. В самом «объектном Си» добавляется ключевое слово nil для указания на то, что «объект не существует». Не смотря на то, что семантически NULL и nil разные ключевые слова, фактически они выполняют одну и ту же роль.
А если подняться на уровень фреймворков?
Foundation определяет объект-синглтон NSNull, который представляет собой «NULL-объект», хотя, фактически, это полноценный объект, у которого есть адрес и размер (об этом чуть позже). Ну и наконец, в Foundation/NSObjCRuntime.h определяется Nil, который являет собой класс-указатель на «ничего».
Немного запутанно, не так ли? Давайте разбираться!
Если с наследием С в виде 0/NULL всё более менее понятно, то на остальных вариантах «ничего» остановимся чуть подробнее. Каждый объект иерархии NSObject после вызова команды alloc инициализируется пустотой. Это значит, что каждое поле получает значение nil/0 в зависимости от типа (скаляр/объект). Поэтому нет необходимости делать это вручную, если какие-то поля требуется помечать как «пусто». Есть ещё одна особенность nil – одновременно дар и проклятье: ему можно посылать сообщения, как обычному объекту, и это не приведёт к крашу приложения! К примеру, такая конструкция вполне себе жизнеспособна:
NSNumber *asd = nil; [asd stringValue];
Для сравнения: в языке С++ подобный вызов однозначно вызовет runtime exception. Зачастую это бывает удобно, поскольку избавляет от лишних проверок на существование объекта, когда в этом нет необходимости. Однако, то же самое вполне может вызвать серьёзные проблемы при отладке, например:
NSMutableDictionary *map = //may cause nil for some reason . [map setValue:value forKey:key];
Так как наш словарь пуст, не произойдёт ничего! И если вызовы и работа со словарём находятся в разных местах, иногда бывает довольно сложно понять, почему словарь пуст, хотя мы явно задаём его заполнение. Выходов из этого довольно много, один из самых распространённых – использование assert наподобие NSParameterAssert для проверки критических частей кода на не-nil у входных параметров.
Рассмотрим класс NSNull
Для чего же он нужен? Представим ситуацию, когда нам нужно сохранить несколько объектов в коллекцию, например, в NSArray. Что произойдёт если часть объектов будет nil? Это вызовет ошибку времени исполнения, потому что массив не сможет определить, сколько памяти надо выделить под пустой (т.е. нулевой по памяти, в этом контексте) объект (а реализация NSArray, в конечном итоге, сводится к выделению памяти под объекты, которые он содержит). Чтобы избежать подобного, используется объект NSNull с единственным методом `+null`, который создаёт этот объект. Это объект-пустышка, показывающий, что реально никакого значения нет, но при этом не нарушается целостность коллекции, в которую его помещают.
Остаётся последнее ключевое слово Nil
Если nil используется для обозначения пустого объекта класса, то Nil используется для ссылки на пустой класс. Разницу можно увидеть из примера: NSString *a = nil; Class b = Nil; Но используется это очень редко. Нужно просто знать, что такое поведение допустимо.
Суммируем всё в виде таблицы:
Ключевое слово | Значение | Пояснение |
NULL | (void *)0 | Пустое значение для указателей языка С |
nil | (id)0 | Пустое значение для объектов Objective C |
Nil | (Class)0 | Пустое значение для классов Objective C |
NSNull | [NSNull null] | Пустой класс-представление языка Objective-C в виде объекта |
Русский [ править ]
Происходит от др.-греч. Νεῖλος «Нейл (собств. имя)», дальнейшая этимология неясна.
Фразеологизмы и устойчивые сочетания [ править ]
Перевод [ править ]
Нил II [ править ]
Морфологические и синтаксические свойства [ править ]
падеж | ед. ч. | мн. ч. |
---|---|---|
Им. | Ни́л | Ни́лы |
Р. | Ни́ла | Ни́лов |
Д. | Ни́лу | Ни́лам |
В. | Ни́ла | Ни́лов |
Тв. | Ни́лом | Ни́лами |
Пр. | Ни́ле | Ни́лах |
Корень: -Нил-.
Произношение [ править ]
Семантические свойства [ править ]
Значение [ править ]
- русское мужское имя ◆ Благословенна память старца Нила Сорского, великого нестяжателя! В. И. Костылев, «Иван Грозный» ◆ Мы беседуем с настоятелем монастыря иеромонахом Нилом.
Синонимы [ править ]
Антонимы [ править ]
Гиперонимы [ править ]
Гипонимы [ править ]
Родственные слова [ править ]
Этимология [ править ]
Перевод [ править ]
Нил III [ править ]
Морфологические и синтаксические свойства [ править ]
падеж | ед. ч. | мн. ч. |
---|---|---|
Им. | Ни́л | Ни́лы |
Р. | Ни́ла | Ни́лов |
Д. | Ни́лу | Ни́лам |
В. | Ни́ла | Ни́лов |
Тв. | Ни́лом | Ни́лами |
Пр. | Ни́ле | Ни́лах |
Корень: -Нил-.
Произношение [ править ]
Семантические свойства [ править ]
Значение [ править ]
- английское мужское имя ◆ Нил Армстронг, вспомнив, что сейчас за ним в прямом эфире наблюдают миллионы телезрителей, остановился на последней ступеньке трапа и произнес первое, что пришло в голову.
Синонимы [ править ]
Антонимы [ править ]
Гиперонимы [ править ]
Гипонимы [ править ]
Родственные слова [ править ]
Ближайшее родство |
Значение nil в Golang
Слово nil является существительным, что значит ничего или ноль. В программировании на Go nil является нулевым значением. Как помните, переменная integer , объявленная без значения, по умолчанию будет равна 0. Пустая строка будет нулевым значением переменной string и так далее. Указатель, который ни на что не указывает, принимает значение nil . Идентификатор nil также обладает нулевым значением для срезов, карт и интерфейсов.
После изучения данной статьи вы сможете:
Премиум канал по Golang
Рекомендуем вам супер TELEGRAM канал по Golang где собраны все материалы для качественного изучения языка. Удивите всех своими знаниями на собеседовании!
Уроки, статьи и Видео
Мы публикуем в паблике ВК и Telegram качественные обучающие материалы для быстрого изучения Go. Подпишитесь на нас в ВК и в Telegram. Поддержите сообщество Go программистов.
- Сделать что-то из ничего;
- Разобраться с проблемами в nil ;
- Увидеть, как Go усовершенствовал nil .
Многие языки программирования также используют концепт nil. Среди его других названий — NULL , null или None . В 2009 году перед релизом Go проектировщик языков программирования Тони Хоар выступил с презентацией под названием «Null References: The Billion Dollar Mistake«. В своей речи Хоар утверждал, что он ответственен за изобретение отсылки null в 1965 году. Он также говорил о том, что указатели в никуда были не лучшей идеей.
На заметку: В 1978 Тони Хоар также впервые описал принцип взаимодействующих последовательных процессов, или «communicating sequential processes», CSP. Его идеи лежат в основе конкурентности Go.
В Go nil является более дружелюбен и менее распространен, нежели в других языках программирования, однако и здесь нужно быть готовым к некоторым проблемам. Nil можно использовать не только по его прямому назначению, о чем говорит Франчес Кампой в своей презентации на GopherCon 2016.
Представьте созвездие, где каждая звезда указывает на ближайшую к ней соседнюю звезду. После вычислений, каждая звезда будет куда-то указывать, и нахождение ближайшей звезды становится быстрым разыменованием указателя.
Однако, пока вычисления не закончены, куда должны указывать указатели? Это тот случай, когда пригодится nil. Nil может значить ближайшую звезду, пока реальная звезда не будет найдена.
В какой еще ситуации указатель в никуда может быть полезен?
Вызывает ли nil сбои в Golang?
Если указатель никуда не указывает, попытка разыменования указателя не сработает, что показано в Листинге 1. Разыменование указателя nil приведет к сбою программы. Обычно пользователям такое совсем не нравится.
Я называю это моей ошибкой в миллиард долларов.
Тони Хоар