Null что значит: Заметка про NULL / Хабр
NULL — это… Что такое NULL?
Null — (de) … Kölsch Dialekt Lexikon
null — null … Hochdeutsch — Plautdietsch Wörterbuch
Null — Pour le musicien japonais, voir Kazuyuki K. Null. NULL est un mot clef présent dans de nombreux langages informatiques, et qui désigne l état d un pointeur qui n a pas de cible ou d une variable qui n a pas de valeur. La notion de valeur ou … Wikipédia en Français
Null — may refer to: Contents 1 In computing 2 In art 3 In mathematics 4 In science 5 People … Wikipedia
Null — «Null» redirige aquí. Para otras acepciones, véase Null (desambiguación). El término null o nulo es a menudo utilizado en la computación, haciendo referencia a la nada. En programación, null resulta ser un valor especial aplicado a un puntero (o… … Wikipedia Español
null — [nʌl] adjective [only before a noun] 1. STATISTICS a null effect, result etc is one that is zero or nothing 2. LAW another name for null and void: • Their suit also asks the court to declare null the buyer s shareholder rights plan. * * * … Financial and business terms
NULL (Си и Си++) — NULL в языках программирования Си и C++ макрос, объявленный в заголовочном файле stddef.h (и других заголовочных файлах). Значением этого макроса является зависящая от реализации константа нулевого указателя (англ. null pointer constant).… … Википедия
null — / nəl/ adj [Anglo French nul, literally, not any, from Latin nullus, from ne not + ullus any]: having no legal or binding force: void a null contract Merriam Webster’s Dictionary of Law. Merriam Webster. 1996 … Law dictionary
Null — Null, a. [L. nullus not any, none; ne not + ullus any, a dim. of unus one; cf. F. nul. See {No}, and {One}, and cf. {None}.] 1. Of no legal or binding force or validity; of no efficacy; invalid; void; nugatory; useless. [1913 Webster] Faultily… … The Collaborative International Dictionary of English
Null-O — is a 1958 science fiction short story by Philip K. Dick. This rather brief story examines the concept of totally unempathic and logical humans ( Null O s) in an obvious parody of the plot and concepts of The Players of Null A by A. E. van Vogt.… … Wikipedia
Null — Sf std. (16. Jh.) Entlehnung. Entlehnt aus l. nulla gleicher Bedeutung, feminine Substantivierung von l. nullus keiner . Dieses ist eine Lehnbedeutung von arab. ṣifr, das ebenfalls Null und leer bedeutet und das seinerseits ai. śūnya Null, leer… … Etymologisches Wörterbuch der deutschen sprache
NULL (Си) — это… Что такое NULL (Си)?
У этого термина существуют и другие значения, см. NULL.
NULL в языках программирования Си и C++ — макрос, объявленный в заголовочном файле stddef.h (и других заголовочных файлах). Значением этого макроса является зависящая от реализации константа нулевого указателя (англ. null pointer constant). Константа нулевого указателя — это целочисленное константное выражение со значением 0, или (только в Си) такое же выражение, но приведённое к типу void *
. Константа нулевого указателя, приведённая к любому типу указателей, является нулевым указателем. Гарантируется, что нулевой указатель не равен указателю на любой объект (в широком смысле слова, любые данные) или функцию. Гарантируется, что любые два нулевых указателя равны между собой. Разыменовывание нулевого указателя является операцией с неопределённым поведением.
Иначе говоря, реализация предоставляет специальное значение — константу нулевого указателя, которую можно присвоить любому указателю и такой указатель при сравнении не будет равен любому «корректному» указателю. То есть, можно считать, что нулевой указатель не содержит корректный адрес в памяти.
Использование
Нулевые указатели придуманы как удобный способ «отметить» указатели, которые заведомо не указывают на корректный адрес в памяти. Например, при объявлении указателя как автоматической переменной его значение не определено. Чтобы отметить, что этот указатель ещё не содержит корректный адрес в памяти, такому указателю присваивают константу нулевого указателя:
void f(void) { int *x = NULL; /* ... */ }
Хорошим стилем программирования является присваивание указателю после освобождения памяти, на которую он ссылался, нулевого указателя. Кроме этого, применение обнуления указателей актуально для безопасности освобождения памяти: операция delete в C++ (free в Си) безопасна для нулевого указателя. Например:
TYPE *foo = new TYPE(); //использование foo delete foo;// foo != NULL //еще 100 строк кода delete foo;//ОШИБКА! память уже недоступна
в то время как в таком варианте ошибки не будет
TYPE *foo = new TYPE(); //использование foo delete foo;// foo != NULL foo = NULL;// foo == NULL //еще 100 строк кода delete foo;//ошибки нет: delete проверяет значение foo
Разыменовывание нулевых указателей
Разыменовывание нулевого указателя является операцией с неопределённым поведением. На реализацию не накладывается никаких ограничений: может произойти, например, обращение к памяти, не предназначенной для использования данной программой (то есть при чтении будет считан «мусор», а при записи — значение будет записано в область памяти, не принадлежащую программе). Например, в DOS запись по нулевому адресу затрёт как минимум нулевой вектор прерываний, так что следующий вызов int 0 приведёт, скорее всего, к зависанию системы. Однако чаще всего это приводит к ошибке времени выполнения (если в операционной системе реализована защита памяти и доступ в невыделенную процессу память блокируется). Например, в Windows 9x сообщение «Общая ошибка защиты» — «Программа выполнила недопустимую операцию и будет закрыта» (англ. general protection fault, GPF) выдаётся чаще всего в тех случаях, когда программа обращается в память по некорректному (в том числе неинициализированному или уже освобождённому) указателю. В Unix-подобных операционных системах в таких ситуациях процесс получает сигнал SIGSEGV и его обработчик выводит сообщение «Segmentation fault».
Нулевые указатели в C++
В отличие от классического Си в C++ значение пустого указателя предопределено стандартом языка и всегда равно 0 (целочисленному нулю, приведённому к типу «указатель»). Поэтому в программах на C++ не только возможно, но и рекомендуется использовать значение 0 вместо NULL[1], однако некоторые программисты считают, что это ухудшает читаемость исходного кода. В стандарте C++11 для обозначения нулевого указателя добавлено новое ключевое слово nullptr[2][3].
См. также
Примечания
Ссылки
null — это… Что такое null?
Null — (de) … Kölsch Dialekt Lexikon
null — null … Hochdeutsch — Plautdietsch Wörterbuch
Null — Pour le musicien japonais, voir Kazuyuki K. Null. NULL est un mot clef présent dans de nombreux langages informatiques, et qui désigne l état d un pointeur qui n a pas de cible ou d une variable qui n a pas de valeur. La notion de valeur ou … Wikipédia en Français
Null — may refer to: Contents 1 In computing 2 In art 3 In mathematics 4 In science 5 People … Wikipedia
Null — «Null» redirige aquí. Para otras acepciones, véase Null (desambiguación). El término null o nulo es a menudo utilizado en la computación, haciendo referencia a la nada. En programación, null resulta ser un valor especial aplicado a un puntero (o… … Wikipedia Español
null — [nʌl] adjective [only before a noun] 1. STATISTICS a null effect, result etc is one that is zero or nothing 2. LAW another name for null and void: • Their suit also asks the court to declare null the buyer s shareholder rights plan. * * * … Financial and business terms
NULL (Си и Си++) — NULL в языках программирования Си и C++ макрос, объявленный в заголовочном файле stddef.h (и других заголовочных файлах). Значением этого макроса является зависящая от реализации константа нулевого указателя (англ. null pointer constant).… … Википедия
null — / nəl/ adj [Anglo French nul, literally, not any, from Latin nullus, from ne not + ullus any]: having no legal or binding force: void a null contract Merriam Webster’s Dictionary of Law. Merriam Webster. 1996 … Law dictionary
Null — Null, a. [L. nullus not any, none; ne not + ullus any, a dim. of unus one; cf. F. nul. See {No}, and {One}, and cf. {None}.] 1. Of no legal or binding force or validity; of no efficacy; invalid; void; nugatory; useless. [1913 Webster] Faultily… … The Collaborative International Dictionary of English
Null-O — is a 1958 science fiction short story by Philip K. Dick. This rather brief story examines the concept of totally unempathic and logical humans ( Null O s) in an obvious parody of the plot and concepts of The Players of Null A by A. E. van Vogt.… … Wikipedia
Null — Sf std. (16. Jh.) Entlehnung. Entlehnt aus l. nulla gleicher Bedeutung, feminine Substantivierung von l. nullus keiner . Dieses ist eine Lehnbedeutung von arab. ṣifr, das ebenfalls Null und leer bedeutet und das seinerseits ai. śūnya Null, leer… … Etymologisches Wörterbuch der deutschen sprache
null — Викисловарь
null (прилагательное)
Морфологические и синтаксические свойства
null
Прилагательное.
Корень: —.
Произношение
Семантические свойства
Значение
- юр. недействительный, не имеющий законной силы ◆ Отсутствует пример употребления (см. рекомендации).
- незначительный, несущественный ◆ Отсутствует пример употребления (см. рекомендации).
- пустой, несуществующий ◆ Отсутствует пример употребления (см. рекомендации).
- нулевой ◆ Отсутствует пример употребления (см. рекомендации).
Синонимы
Антонимы
Гиперонимы
Гипонимы
Родственные слова
Ближайшее родство | |
Этимология
Происходит от итал. nulla «ничто», от лат. nullus «никакой, ни один; несуществующий; пустой», далее из ne- + illus.
Фразеологизмы и устойчивые сочетания
null (существительное)
Морфологические и синтаксические свойства
null
Существительное.
Корень: —.
Произношение
Семантические свойства
Значение
- комп. нуль; отсутствие информации ◆ Отсутствует пример употребления (см. рекомендации).
Синонимы
Антонимы
Гиперонимы
Гипонимы
Родственные слова
Ближайшее родство | |
Этимология
От ??
Фразеологизмы и устойчивые сочетания
null (глагол)
Морфологические и синтаксические свойства
null
Глагол.
Корень: —.
Произношение
Семантические свойства
Значение
- обнулять ◆ Отсутствует пример употребления (см. рекомендации).
Синонимы
dev/null — Lurkmore
/dev/null (иногда /dev/nul) — Выражение «отправить <что-то> в /dev/null» означает «избавиться», «выбросить», «проигнорировать».
[править] Технические характеристики
Происходит от специального файла (псевдоустройства) в *nix-подобных системах. Знаменит тем, что может принять произвольный объём данных, не сохраняя их совершенно нигде, поэтому его часто используют в качестве «чёрной дыры», куда можно отправить ненужный вывод программы или спам.
[править] Прочие /dev/* в Линуксах
Алсо, у линуксоидов есть и другие забавные (тем не менее имеющие вполне реальное и нужное применение) файлы/устройства, например:
- /dev/random (/dev/urandom) — если в /dev/null обычно отправляют, то из /dev/random’а обычно забирают данные. Только вот данные эти являются бессвязным бредом (случайно генерированным системой из побочных продуктов [шумов] работы всяких драйверов) для генерации всяких ключей.
- Еще одно ценное устройство /dev/zero. Как можно догадаться тоже отдает данные, более чем полностью, состоящие из нулей. Видимо в Линуксе дефицит нулей, и поэтому для их генерации пришлось придумать специальное устройство[1]. На самом деле /dev/zero применяется для многих разных и полезных вещей, например для низкоуровневого форматирования с защитой от кровавой гэбни. Алсо, работает в 10 раз быстрее рандома.
Unix — выпрямитель для рук волос
И Яндекс!
Иногда у линуксоидов встречается другое употребление связанных с этим понятий. Например, предложение юзеру проверить работоспособность /dev/brain может означать то, что у юзера не все в порядке в области мыслительной деятельности или что он является бокланом. /dev/hands ассоциируется с руками, и фраза «error accessing /dev/hands» может означать, что у человека кривые руки.
Есть еще устройство /dev/ass. Поговорка в тему — «все ставится через /dev/ass», то есть «все ставится через жопу» (что намекает на Gentoo).
Аналогичной шуткой среди виндоузятников являются многочисленные замечания про hands.exe (pryamie_ruki.exe, directhands.dll), hands.sys (Номад говорит ruki.sys) или brain.dll.
Судя по профилям ЛОРа, null является городом проживания чуть более, чем половины лоровцев.
В MSDOS/Windows-системах такая топка также существует и называется она «NUL».
То есть, перенаправление
echo 123 > NUL
аналогично перенаправлению
echo 123 > /dev/null
в Линуксах.
В хендбуке по Фряхе было официально заявлено, что именно информация, отправленная в /dev/null, является причиной нагрева CPU. [2]
Существует очень доставляющий брейккор исполнитель с таким вот псевдонимом
из Бостона, США. Настоящее имя Pete Cassin. Ранее играл на барабанах в crust/grind-группе Fate Of Icarus. Начиная с 97-го года начал увлекаться такими направлениями, как jungle, breakcore. А ещё он по совместительству программист, так-то.
Алсо, Dev/null имя вампира-шизофреника, который по совместительству является хакером и помогает главному герою, из винрарных игр «Vampire: The Masquerade — Bloodlines» и «Vampires The Masquerade — Redemption».
Также в картостроении к движкам Халфы присутствует текстура null, которая говорит не обрабатывать то, что ею закрашено.
- ↑ А еще нули можно передавать по SSH: [1]
«Dev/null» имеет отношение к универсальным ответам. | |||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Определение
в кембриджском словаре английского языка
Остальные задействованные моды, в том числе соответствующие и его производные, считаются численно равными null .
Также важно отметить, что способность теста отклонять гипотезу null , вероятно, страдает от такого рода процедуры.
Эти примеры взяты из Cambridge English Corpus и из источников в Интернете. Любые мнения в примерах не отражают мнение редакторов Cambridge Dictionary, Cambridge University Press или его лицензиаров.
Еще примеры
Меньше примеров
Ответы представлены как функция яркости компонента нулевого направления прозрачного стимула.Высказывания детей были закодированы для информационного статуса любых ссылающихся выражений с использованием четырех категорий: полное существительное, местоимение, , пустое значение, и отсутствие ответа.Качество соответствия во всех спецификациях является разумным, и гипотезы null об отсутствии ошибок в спецификации и гомоскедастичности также не отвергаются.
Null Результаты трудно интерпретировать из-за небольших выборок и коротких периодов наблюдения (f2 года), использованных в большинстве предыдущих исследований.Это, в свою очередь, позволит изучить вопрос о том, чувствительны ли полученные результаты по размеру к форме спектра, принятой в рамках гипотезы null .Это может отражать то, что исследователи хотят иметь возможность делать вероятностные утверждения о том, что гипотеза null ложна (1).
Эта нестабильность, по-видимому, возникает из-за того, что колебания силовой линии накапливаются в нулевой точке таким образом, что она не может оставаться статичной.Что касается числа, null субъектов встречались только в единственном контексте и никогда во множественном контексте.
Есть несколько других причин, по которым могли возникнуть эти null -эффекты..
Что означают NULL и NOT NULL в базе данных MySQL
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
6.7a — Нулевые указатели | Изучите C ++
Нулевые значения и нулевые указатели
Как и обычные переменные, указатели не инициализируются при их создании. Если значение не назначено, указатель по умолчанию будет указывать на какой-то мусорный адрес.
Помимо адресов памяти, есть еще одно значение, которое может содержать указатель: нулевое значение. Нулевое значение — это специальное значение, которое означает, что указатель ни на что не указывает. Указатель, содержащий нулевое значение, называется нулевым указателем .
В C ++ мы можем присвоить указателю нулевое значение, инициализировав или присвоив ему литерал 0:
с плавающей запятой * ptr {0}; // ptr теперь пустой указатель float * ptr2; // ptr2 не инициализирован ptr2 = 0; // ptr2 теперь является нулевым указателем |
Указатели преобразуются в логическое значение false, если они равны нулю, и в логическое значение true, если они не равны нулю. Следовательно, мы можем использовать условное выражение, чтобы проверить, является ли указатель нулевым или нет:
двойной * ptr {0}; // указатели преобразуются в логическое значение false, если они равны нулю, и в логическое значение true, если они не равны нулю if (ptr) std :: cout << "ptr указывает на двойное значение."; else std :: cout <<" ptr - нулевой указатель. "; |
Инициализируйте указатели нулевым значением, если вы не присваиваете им другое значение.
Разыменование нулевых указателей
В предыдущем уроке мы отметили, что разыменование указателя мусора приведет к неопределенным результатам. Разыменование нулевого указателя также приводит к неопределенному поведению. В большинстве случаев это приведет к сбою вашего приложения.
Концептуально в этом есть смысл.Разыменование указателя означает «перейти по адресу, на который указывает указатель, и получить доступ к значению там». Нулевой указатель не имеет адреса. Итак, когда вы пытаетесь получить доступ к значению по этому адресу, что он должен делать?
Макрос NULL
В C ++ существует специальный макрос препроцессора, называемый NULL (определенный в заголовке
#include double * ptr {NULL}; // ptr — это нулевой указатель |
Значение NULL определяется реализацией, но обычно определяется как целочисленная константа 0.Примечание. Начиная с C ++ 11, NULL можно определить как nullptr (что мы немного обсудим).
Поскольку NULL — это макрос препроцессора со значением, определяемым реализацией, избегайте использования NULL.
Опасности использования 0 (или NULL) для нулевых указателей
Обратите внимание, что значение 0 не является типом указателя, поэтому присвоение 0 (или NULL, до C ++ 11) указателю, чтобы обозначить, что указатель является нулевым указателем, немного противоречиво. В редких случаях, когда он используется в качестве буквального аргумента, он может даже вызвать проблемы, потому что компилятор не может определить, имеет ли мы в виду нулевой указатель или целое число 0:
.
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 21 22 23 24 25 | #include #include void print (int x) { std :: cout << "print (int):" << x < <'\ n'; } void print (int * x) { if (! X) std :: cout << "print (int *): null \ n"; else std :: cout << "print (int *):" << * x << '\ n'; } int main () { int * x {NULL}; принт (х); // вызывает print (int *), потому что x имеет тип int * print (0); // вызывает print (int), потому что 0 — целочисленный литерал print (NULL); // скорее всего вызывает print (int), хотя мы, вероятно, хотели print (int *) return 0; } |
В вероятном случае, когда NULL определен как значение 0, print (NULL) вызовет print (int), а не print (int *), как вы могли бы ожидать от литерала нулевого указателя.
nullptr в C ++ 11
Для решения вышеуказанных проблем в C ++ 11 введено новое ключевое слово nullptr . nullptr — это ключевое слово, очень похожее на логические ключевые слова true и false.
Начиная с C ++ 11, если нам нужен нулевой указатель, следует отдавать предпочтение этому, а не 0:
int * ptr {nullptr}; // примечание: ptr по-прежнему является целочисленным указателем, просто установлено нулевое значение |
C ++ неявно преобразует nullptr в любой тип указателя.Итак, в приведенном выше примере nullptr неявно преобразуется в целочисленный указатель, а затем значение nullptr присваивается ptr. Это приводит к тому, что целочисленный указатель ptr становится нулевым указателем.
Мы также можем вызвать функцию с литералом nullptr, который будет соответствовать любому параметру, принимающему значение указателя:
1 2 3 4 5 6 7 8 9 10 11 12 13 140002 14 18 19 20 21 22 23 24 | #include void print (int x) { std :: cout << "print (int):" << x << '\ n'; } void print (int * x) { if (! X) std :: cout << "print (int *): null \ n"; else std :: cout << "print (int *):" << * x << '\ n'; } int main () { int * x {nullptr}; принт (х); // вызывает print (int *) print (nullptr); // по желанию вызывает print (int *) return 0; } |
Функция с другим списком параметров является новой функцией, даже если функция с тем же именем существует.Мы рассмотрим это позже (перегрузка функций).
Используйте nullptr для инициализации указателей нулевым значением.
std :: nullptr_t
C ++ 11 также представляет новый тип std :: nullptr_t (в заголовке
#include #include void doSomething (std :: nullptr_t ptr) { std :: cout << "в doSomething \ п "; } int main () { doSomething (nullptr); // вызов doSomething с аргументом типа std :: nullptr_t return 0; } |
Возможно, вам никогда не понадобится это использовать, но на всякий случай полезно знать.
.
схем и типов | GraphQL
На этой странице вы узнаете все, что вам нужно знать о системе типов GraphQL и о том, как она описывает, какие данные можно запрашивать. Поскольку GraphQL можно использовать с любой внутренней структурой или языком программирования, мы не будем касаться деталей, связанных с реализацией, и поговорим только о концепциях.
Система типов #
Если вы раньше видели запросы GraphQL, то знаете, что язык запросов GraphQL в основном предназначен для выбора полей на объектах.Так, например, в следующем запросе:
- Мы начинаем со специального «корневого» объекта
- Мы выбираем поле
hero
на этом - Для объекта, возвращаемого
hero
, мы выбираем имяпоявляется в полях
Поскольку форма запроса GraphQL близко соответствует результату, вы можете предсказать, что запрос вернет, даже не зная о сервере. Но полезно иметь точное описание данных, которые мы можем запросить — какие поля мы можем выбрать? Какие предметы они могут вернуть? Какие поля доступны для этих подобъектов? Вот тут-то и пригодится схема.
Каждая служба GraphQL определяет набор типов, которые полностью описывают набор возможных данных, которые вы можете запросить в этой службе. Затем, когда поступают запросы, они проверяются и выполняются по этой схеме.
Типовой язык #
Сервисы GraphQL могут быть написаны на любом языке. Поскольку мы не можем полагаться на синтаксис конкретного языка программирования, такого как JavaScript, чтобы говорить о схемах GraphQL, мы определим наш собственный простой язык. Мы будем использовать «язык схем GraphQL» — он похож на язык запросов и позволяет нам говорить о схемах GraphQL независимо от языка.
Типы объектов и поля #
Самыми основными компонентами схемы GraphQL являются типы объектов, которые просто представляют собой тип объекта, который вы можете получить из вашего сервиса, и поля, которые он имеет. На языке схем GraphQL мы могли бы представить это так:
type Character { имя: Строка! Появляется в: [Эпизод!]! }
Язык довольно читабелен, но давайте рассмотрим его, чтобы у нас был общий словарь:
-
Символ
— это GraphQL Object Type , что означает, что это тип с некоторыми полями.Большинство типов в вашей схеме будут типами объектов. -
имя
ипоявляется В
поля для типаCharacter
. Это означает, чтоname
ипоявляются В
— единственные поля, которые могут появляться в любой части запроса GraphQL, который работает с типомCharacter
. -
Строка
— это один из встроенных скалярных типов — это типы, которые разрешаются в один скалярный объект и не могут иметь подвыборки в запросе.Позже мы еще рассмотрим скалярные типы. -
Строка!
означает, что это поле , не допускающее значение NULL , что означает, что служба GraphQL обещает всегда предоставлять вам значение при запросе этого поля. На языке шрифтов мы будем обозначать их восклицательным знаком. -
[Эпизод!]!
представляет собой массив изобъектов эпизода
. Поскольку это также , не обнуляемый , вы всегда можете ожидать массив (с нулем или более элементами) при запросе поляотображаетсяIn
.А начиная с серии!
также , не обнуляемый , вы всегда можете ожидать, что каждый элемент массива будет объектомEpisode
.
Теперь вы знаете, как выглядит тип объекта GraphQL, и как читать основы языка типов GraphQL.
Аргументы #
Каждое поле типа объекта GraphQL может иметь ноль или более аргументов, например поле длины
ниже:
type Starship { я сделал! имя: Строка! length (unit: LengthUnit = METER): Float }
Все аргументы названы.В отличие от языков вроде JavaScript и Python, где функции принимают список упорядоченных аргументов, все аргументы в GraphQL передаются по имени. В этом случае поле длины
имеет один определенный аргумент, unit
.
Аргументы могут быть обязательными или необязательными. Если аргумент является необязательным, мы можем определить значение по умолчанию — если аргумент unit
не передан, по умолчанию будет установлено значение METER
.
Типы запросов и мутаций #
Большинство типов в вашей схеме будут обычными типами объектов, но есть два типа, которые являются особенными в схеме:
schema { query: Запрос мутация: Мутация }
Каждая служба GraphQL имеет тип запроса
и может иметь или не иметь тип мутации
.Эти типы аналогичны обычным типам объектов, но они особенные, потому что они определяют точку входа каждого запроса GraphQL. Итак, если вы видите запрос, который выглядит так:
Это означает, что служба GraphQL должна иметь тип Query
с полями hero
и droid
:
type Query { герой (эпизод: эпизод): персонаж дроид (id: ID!): Дроид }
Мутации работают аналогичным образом — вы определяете поля для типа Mutation
, и они доступны как поля корневых мутаций, которые вы можете вызывать в своем запросе.
Важно помнить, что кроме особого статуса «точки входа» в схему, типы Query
и Mutation
такие же, как и любой другой тип объекта GraphQL, и их поля работают точно так же. .
Скалярные типы #
Тип объекта GraphQL имеет имя и поля, но в какой-то момент эти поля должны преобразоваться в некоторые конкретные данные. Вот тут-то и пригодятся скалярные типы: они представляют собой листы запроса.
В следующем запросе имена
и появляются В полях
будут преобразованы в скалярные типы:
Мы знаем это, потому что эти поля не имеют подполей — они являются листьями запроса.
GraphQL поставляется с набором скалярных типов по умолчанию из коробки:
-
Int
: 32-битное целое число со знаком. -
Float
: значение с плавающей запятой двойной точности со знаком. -
Строка
: последовательность символов UTF ‐ 8. -
Boolean
:true
илиfalse
. -
ID
: скалярный тип ID представляет уникальный идентификатор, часто используемый для повторной выборки объекта или как ключ для кеша. Тип ID сериализуется так же, как String; однако определение его какID
означает, что он не предназначен для чтения человеком.
В большинстве реализаций сервиса GraphQL также есть способ указать пользовательские скалярные типы. Например, мы могли бы определить тип Date
:
scalar Date
Затем наша реализация должна определить, как этот тип должен быть сериализован, десериализован и валидирован.Например, вы можете указать, что тип Date
всегда должен быть сериализован в целочисленную метку времени, и ваш клиент должен знать, что этот формат следует ожидать для любых полей даты.
Типы перечисления #
Перечислимые типы, также называемые Перечисления , представляют собой особый вид скаляра, который ограничен определенным набором допустимых значений. Это позволяет вам:
- Проверять, что любые аргументы этого типа являются одним из допустимых значений
- Сообщать через систему типов, что поле всегда будет одним из конечного набора значений
Вот что может быть определение перечисления выглядит так на языке схемы GraphQL:
enum Episode { НОВАЯ НАДЕЖДА ИМПЕРИЯ Джедаи }
Это означает, что где бы мы ни использовали тип Episode
в нашей схеме, мы ожидаем, что он будет точно одним из NEWHOPE
, EMPIRE
или JEDI
.
Обратите внимание, что реализации службы GraphQL на разных языках будут иметь свой собственный специфичный для языка способ работы с перечислениями. В языках, которые поддерживают перечисления в качестве первоклассного гражданина, реализация может использовать это преимущество; на таком языке, как JavaScript, без поддержки перечислений, эти значения могут быть внутренне сопоставлены с набором целых чисел. Однако эти детали не передаются клиенту, который может полностью работать с именами строк значений перечисления.
Списки и ненулевые значения #
Типы объектов, скаляры и перечисления — единственные типы типов, которые вы можете определить в GraphQL.Но когда вы используете типы в других частях схемы или в объявлениях переменных запроса, вы можете применить дополнительные модификаторы типа , которые влияют на проверку этих значений. Давайте посмотрим на пример:
type Character { имя: Строка! Появляется в: [Эпизод]! }
Здесь мы используем тип String
и помечаем его как Non-Null , добавляя восклицательный знак, !
после названия типа. Это означает, что наш сервер всегда ожидает возврата ненулевого значения для этого поля, и если он в конечном итоге получит нулевое значение, которое фактически вызовет ошибку выполнения GraphQL, давая клиенту знать, что что-то пошло не так.
Модификатор типа Non-Null также может использоваться при определении аргументов для поля, что приведет к тому, что сервер GraphQL будет возвращать ошибку проверки, если в качестве этого аргумента передается нулевое значение, будь то в строке GraphQL или в переменных.
Списки
работают аналогичным образом: мы можем использовать модификатор типа, чтобы пометить тип как Список
, который указывает, что это поле вернет массив этого типа. На языке схемы это обозначается заключением типа в квадратные скобки: [
и ]
.Это работает так же для аргументов, где на этапе проверки будет ожидаться массив для этого значения.
Модификаторы Non-Null и List можно комбинировать. Например, у вас может быть список ненулевых строк:
myField: [String!]
Это означает, что сам список может быть нулевым, но не может иметь никаких нулевых членов. Например, в JSON:
myField: null myField: [] myField: ['a', 'b'] myField: ['a', null, 'b']
Теперь предположим, что мы определили ненулевой список строк:
myField: [String]!
Это означает, что сам список не может быть нулевым, но может содержать нулевые значения:
myField: null myField: [] myField: ['a', 'b'] myField: ['a', null, 'b']
Вы можете произвольно вложить любое количество модификаторов Non-Null и List в соответствии с вашими потребностями.
Интерфейсы #
Как и многие системы типов, GraphQL поддерживает интерфейсы. Интерфейс — это абстрактный тип, который включает в себя определенный набор полей, которые тип должен включать для реализации интерфейса.
Например, у вас может быть интерфейс Character
, который представляет любого персонажа в трилогии Star Wars:
interface Character { я сделал! имя: Строка! друзья: [Персонаж] Появляется в: [Эпизод]! }
Это означает, что любой тип, который реализует Символ
, должен иметь именно эти поля с этими аргументами и типами возвращаемых значений.
Например, вот некоторые типы, которые могут реализовывать Character
:
тип Человек реализует Character { я сделал! имя: Строка! друзья: [Персонаж] Появляется в: [Эпизод]! звездолеты: [Starship] totalCredits: Int } type Droid реализует Character { я сделал! имя: Строка! друзья: [Персонаж] Появляется в: [Эпизод]! primaryFunction: String }
Вы можете видеть, что оба этих типа имеют все поля из интерфейса Character
, но также содержат дополнительные поля: totalCredits
, звездолетов
и primaryFunction
, которые относятся к этому конкретному типу характер.
Интерфейсы полезны, когда вы хотите вернуть объект или набор объектов, но они могут быть нескольких разных типов.
Например, обратите внимание, что следующий запрос вызывает ошибку:
Поле hero
возвращает тип Character
, что означает, что это может быть Human
или Droid
в зависимости от аргумента эпизода
. В приведенном выше запросе вы можете запрашивать только поля, которые существуют в интерфейсе Character
, который не включает primaryFunction
.
Чтобы запросить поле для определенного типа объекта, вам необходимо использовать встроенный фрагмент:
Подробнее об этом см. В разделе встроенных фрагментов в руководстве по запросам.
Типы объединения #
Типы объединения очень похожи на интерфейсы, но они не могут указывать какие-либо общие поля между типами.
объединение SearchResult = Human | Дроид | Starship
Везде, где мы возвращаем тип SearchResult
в нашей схеме, мы можем получить Human
, Droid
или Starship
.Обратите внимание, что члены типа объединения должны быть конкретными типами объектов; вы не можете создать тип объединения из интерфейсов или других объединений.
В этом случае, если вы запрашиваете поле, которое возвращает тип объединения SearchResult
, вам необходимо использовать условный фрагмент, чтобы иметь возможность запрашивать любые поля вообще:
Поле __typename
преобразуется в строку String
что позволяет отличать разные типы данных друг от друга на клиенте.
Кроме того, в этом случае, поскольку Human
и Droid
имеют общий интерфейс ( Character
), вы можете запрашивать их общие поля в одном месте, вместо того, чтобы повторять одни и те же поля для нескольких типов:
{ search (text: "an") { __typename ... on Character { имя } ... on Human { высота } ... на Droid { основная функция } ... на Starship { имя длина } } }
Обратите внимание, что имя
все еще указано в Starship
, потому что в противном случае оно не отображалось бы в результатах, учитывая, что Starship
не является символом
!
Типы ввода #
До сих пор мы говорили только о передаче скалярных значений, таких как перечисления или строки, в качестве аргументов в поле.Но вы также можете легко передать сложные объекты. Это особенно ценно в случае мутаций, когда вы можете захотеть передать целый объект для создания. На языке схем GraphQL типы ввода выглядят точно так же, как и обычные типы объектов, но с ключевым словом input
вместо type
:
input ReviewInput { звезды: Int! комментарий: Строка }
Вот как вы можете использовать тип входного объекта в мутации:
Поля в типе входного объекта могут сами ссылаться на типы входных объектов, но вы не можете смешивать типы входных и выходных данных в своей схеме.Типы входных объектов также не могут иметь аргументы в своих полях.
.