4 глава fix 2

This commit is contained in:
Alexander Zhirov 2023-02-06 00:31:53 +03:00
parent 50debdf57d
commit 916940b95f
1 changed files with 43 additions and 45 deletions

View File

@ -1113,7 +1113,7 @@ void main()
Кодировка литерала определяется контекстом, в котором этот литерал используется. В предыдущем примере компилятор преобразует строковый литерал, без какой-либо обработки во время исполнения программы, из кодировки UTF-8 в кодировку UTF-16, а потом в кодировку UTF-32 (соответствующие типам `string`, `wstring` и `dstring`), хотя написание литералов во всех трех случаях одинаково. Если требуемая кодировка литерала не может быть однозначно определена, добавьте к нему суффикс `c`, `w` или `d` (например, `"как_здесь"d`): строка будет преобразована в кодировку UTF-8, UTF-16 или UTF-32 соответственно (см. раздел 2.2.5.2). Кодировка литерала определяется контекстом, в котором этот литерал используется. В предыдущем примере компилятор преобразует строковый литерал, без какой-либо обработки во время исполнения программы, из кодировки UTF-8 в кодировку UTF-16, а потом в кодировку UTF-32 (соответствующие типам `string`, `wstring` и `dstring`), хотя написание литералов во всех трех случаях одинаково. Если требуемая кодировка литерала не может быть однозначно определена, добавьте к нему суффикс `c`, `w` или `d` (например, `"как_здесь"d`): строка будет преобразована в кодировку UTF-8, UTF-16 или UTF-32 соответственно (см. раздел 2.2.5.2).
[В начало ⮍](#4-5-4-массивы-знаков--бонусы--строки) [Наверх ⮍](#4-массивы-ассоциативные-массивы-и-строки) [В начало ⮍](#4-5-4-массивы-знаков-бонусы-строки) [Наверх ⮍](#4-массивы-ассоциативные-массивы-и-строки)
#### 4.5.4.1. Цикл foreach применительно к строкам #### 4.5.4.1. Цикл foreach применительно к строкам
@ -1230,7 +1230,7 @@ y += 100; // Хм...
Существует «урезанная» безопасная версия D, известная как SafeD (см. главу 11), также есть флаг компилятора, установка которого включает проверку принадлежности используемых в программе инструкций и типов данных этому безопасному подмножеству средств языка. Естественно, в безопасном D (SafeD) запрещено большинство операций с указателями. Встроенные массивы это важное средство, позволяющее создавать мощные, выразительные программы на SafeD. Существует «урезанная» безопасная версия D, известная как SafeD (см. главу 11), также есть флаг компилятора, установка которого включает проверку принадлежности используемых в программе инструкций и типов данных этому безопасному подмножеству средств языка. Естественно, в безопасном D (SafeD) запрещено большинство операций с указателями. Встроенные массивы это важное средство, позволяющее создавать мощные, выразительные программы на SafeD.
[В начало ⮍](#4-6-опасный-собрат-массива--указатель) [Наверх ⮍](#4-массивы-ассоциативные-массивы-и-строки) [В начало ⮍](#4-6-опасный-собрат-массива-указатель) [Наверх ⮍](#4-массивы-ассоциативные-массивы-и-строки)
## 4.7. Итоги и справочник ## 4.7. Итоги и справочник
@ -1240,64 +1240,64 @@ y += 100; // Хм...
|Выражение|Тип|Описание| |Выражение|Тип|Описание|
|-|-|-| |-|-|-|
|`new T[n]`|`T[]`|Создает массив ([раздел 4.1](../chapter-4-1/))| |`new T[n]`|`T[]`|Создает массив ()|
|`[t1,t2, ..., tk]`|`T[]`|Литерал массива; `T` определяется по типу `t1` (разделы [2.2.6](../../2/chapter-2-2-6/) и [4.1](../chapter-4-1/))| |`[t1,t2, ..., tk]`|`T[]`|Литерал массива; `T` определяется по типу `t1` ()|
|`a = b`|`T[]`|Присваивает один массив другому ([раздел 4.1.4](../chapter-4-1-4/))| |`a = b`|`T[]`|Присваивает один массив другому ()|
|`a[<в>]`|`ref T`|Предоставляет доступ к элементу по индексу (символ `$` в выражении `<в>` заменяется на `a.length`, `<в>` должно быть приводимым к типу `размер_t`; кроме того, должно соблюдаться условие `<в> < a.length`) ([раздел 4.1](../chapter-4-1/))| |`a[<в>]`|`ref T`|Предоставляет доступ к элементу по индексу (символ `$` в выражении `<в>` заменяется на `a.length`, `<в>` должно быть приводимым к типу `размер_t`; кроме того, должно соблюдаться условие `<в> < a.length`) ()|
|`a[<в1> .. <в2>]`|`T[]`|Получает срез массива `a` (знак `$` в `<в1>` и `<в2>` заменяется на `a.length`, `<в1>` и `<в2>` должны быть приводимыми к типу `размер_t`, также должно соблюдаться условие `<в1> <= <в2> && <в2> <= a.length`) ([раздел 4.1.3](../chapter-4-1-3/))| |`a[<в1> .. <в2>]`|`T[]`|Получает срез массива `a` (знак `$` в `<в1>` и `<в2>` заменяется на `a.length`, `<в1>` и `<в2>` должны быть приводимыми к типу `размер_t`, также должно соблюдаться условие `<в1> <= <в2> && <в2> <= a.length`) ()|
|`a[]`|`T[]`|Поэлементная операция ([раздел 4.1.7](../chapter-4-1-7/)) или альтернативное написание выражения `a[0 .. $]`, возвращающего содержимое всего массива| |`a[]`|`T[]`|Поэлементная операция () или альтернативное написание выражения `a[0 .. $]`, возвращающего содержимое всего массива|
|`a.dup`|`T[]`|Получает дубликат массива ([раздел 4.1](../chapter-4-1/))| |`a.dup`|`T[]`|Получает дубликат массива ()|
|`a.length`|`размер_t`|Читает длину массива ([раздел 4.1.10](../chapter-4-1-10/))| |`a.length`|`размер_t`|Читает длину массива ()|
|`a.length = n`|`размер_t`|Изменяет длину массива ([раздел 4.1.1](../chapter-4-1-1/))| |`a.length = n`|`размер_t`|Изменяет длину массива ()|
|`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу (разделы [4.1.5](../chapter-4-1-5/) и [2.3.4.3](../../2/chapter-2-3-4-3/))| |`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу ()|
|`a !is b`|`bool`|То же, что `!(a is b)`| |`a !is b`|`bool`|То же, что `!(a is b)`|
|`a == b`|`bool`|Поэлементно сравнивает массивы на равенство ([раздел 4.1.5](../chapter-4-1-5/))| |`a == b`|`bool`|Поэлементно сравнивает массивы на равенство ()|
|`a != b`|`bool`|То же, что `!(a == b)`| |`a != b`|`bool`|То же, что `!(a == b)`|
|`a ~ t`|`T[]`|Конкатенирует массив и отдельное значение ([раздел 4.1.6](../chapter-4-1-6/))| |`a ~ t`|`T[]`|Конкатенирует массив и отдельное значение ()|
|`t ~ a`|`T[]`|Конкатенирует отдельное значение и массив ([раздел 4.1.6](../chapter-4-1-6/))| |`t ~ a`|`T[]`|Конкатенирует отдельное значение и массив ()|
|`a ~ b`|`T[]`|Конкатенирует два массива ([раздел 4.1.6](../chapter-4-1-6/))| |`a ~ b`|`T[]`|Конкатенирует два массива ()|
|`a ~= t`|`T[]`|Присоединяет элемент к массиву ([раздел 4.1.6](../chapter-4-1-6/))| |`a ~= t`|`T[]`|Присоединяет элемент к массиву ()|
|`a ~= b`|`T[]`|Присоединяет один массив к другому ([раздел 4.1.6](../chapter-4-1-6/))| |`a ~= b`|`T[]`|Присоединяет один массив к другому ()|
|`a.ptr`|`T*`|Возвращает адрес первого элемента массива `a` (небезопасная операция) ([раздел 4.6](../chapter-4-6/))| |`a.ptr`|`T*`|Возвращает адрес первого элемента массива `a` (небезопасная операция) ()|
*Таблица 4.4. Операции над массивами фиксированной длины (`a` и `b` два значения типа `T[]`; `t`, `t1`, ..., `tk` значения типа `T`; `n` значение, приводимое к типу `размер_t`)* *Таблица 4.4. Операции над массивами фиксированной длины (`a` и `b` два значения типа `T[]`; `t`, `t1`, ..., `tk` значения типа `T`; `n` значение, приводимое к типу `размер_t`)*
|Выражение|Тип|Описание| |Выражение|Тип|Описание|
|-|-|-| |-|-|-|
|`[t1, ..., tk]`|`T[k]`|Литерал массива, но только если тип `T[k]` запрошен явно; `T` определяется по типу `t1` (разделы [2.2.6](../../2/chapter-2-2-6/) и [4.1](../chapter-4-1/))| |`[t1, ..., tk]`|`T[k]`|Литерал массива, но только если тип `T[k]` запрошен явно; `T` определяется по типу `t1` ()|
|`a = b`|`ref T[n]`|Копирует содержимое одного массива в другой ([раздел 4.2.4](../chapter-4-2-4/))| |`a = b`|`ref T[n]`|Копирует содержимое одного массива в другой ()|
|`a[<в>]`|`ref T`|Предоставляет доступ к элементу по индексу (символ `$` в `<в>` заменяется на `a.length`, `<в>` должно быть приводимым к типу `размер_t`; кроме того, должно соблюдаться условие `<в> < a.length`) ([раздел 4.1](../chapter-4-1/))| |`a[<в>]`|`ref T`|Предоставляет доступ к элементу по индексу (символ `$` в `<в>` заменяется на `a.length`, `<в>` должно быть приводимым к типу `размер_t`; кроме того, должно соблюдаться условие `<в> < a.length`) ()|
|`a[<в1> .. <в2>]`|`T[]/T[k]`|Получает срез массива `a` (символ `$` в `<в1>` и `<в2>` заменяется на `a.length`, `<в1>` и `<в2>` должны быть приводимыми к типу `размер_t`, также должно соблюдаться условие `<в1> <= <в2> && <в2> <= a.length`) ([раздел 4.2.3](../chapter-4-2-3/))| |`a[<в1> .. <в2>]`|`T[]/T[k]`|Получает срез массива `a` (символ `$` в `<в1>` и `<в2>` заменяется на `a.length`, `<в1>` и `<в2>` должны быть приводимыми к типу `размер_t`, также должно соблюдаться условие `<в1> <= <в2> && <в2> <= a.length`) ())|
|`a[]`|`T[]`|Поэлементная операция ([раздел 4.1.7](../chapter-4-1-7/)) или приведение `a` (массива фиксированной длины) к типу динамического массива, то же, что и `a[0 .. $]`| |`a[]`|`T[]`|Поэлементная операция () или приведение `a` (массива фиксированной длины) к типу динамического массива, то же, что и `a[0 .. $]`|
|`a.dup`|`T[]`|Получает дубликат массива ([раздел 4.2.4](../chapter-4-2-4/))| |`a.dup`|`T[]`|Получает дубликат массива ()|
|`a.length`|`размер_t`|Читает длину массива ([раздел 4.2.1](../chapter-4-2-1/))| |`a.length`|`размер_t`|Читает длину массива ()|
|`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу (разделы [4.2.5](../chapter-4-2-5/) и [2.3.4.3](../../2/chapter-2-3-4-3/))| |`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу ()|
|`a !is b`|`bool`|То же, что и `!(a is b)`| |`a !is b`|`bool`|То же, что и `!(a is b)`|
|`a == b`|`bool`|Поэлементно сравнивает массивы на равенство (разделы [4.2.5](../chapter-4-2-5/) и [2.3.12](../../2/chapter-2-3-12-1/))| |`a == b`|`bool`|Поэлементно сравнивает массивы на равенство ()|
|`a != b`|`bool`|То же, что и `!(a == b)`| |`a != b`|`bool`|То же, что и `!(a == b)`|
|`a ~ t`|`T[]`|Конкатенирует массив и отдельное значение ([раздел 4.2.6](../chapter-4-2-6/))| |`a ~ t`|`T[]`|Конкатенирует массив и отдельное значение ()|
|`t ~ a`|`T[]`|Конкатенирует отдельное значение и массив ([раздел 4.2.6](../chapter-4-2-6/))| |`t ~ a`|`T[]`|Конкатенирует отдельное значение и массив ()|
|`a ~ b`|`T[]`|Конкатенирует два массива ([раздел 4.2.6](../chapter-4-2-6/))| |`a ~ b`|`T[]`|Конкатенирует два массива ()|
|`a.ptr`|`T*`|Возвращает адрес первого элемента массива `a` (небезопасная операция)| |`a.ptr`|`T*`|Возвращает адрес первого элемента массива `a` (небезопасная операция)|
*Таблица 4.5. Операции над ассоциативными массивами (`a` и `b` два значения типа `V[K]`; `k`, `k1`, ..., `ki` значения типа `K`; `v`, `v1`, ..., `vk` значения типа `V`)* *Таблица 4.5. Операции над ассоциативными массивами (`a` и `b` два значения типа `V[K]`; `k`, `k1`, ..., `ki` значения типа `K`; `v`, `v1`, ..., `vk` значения типа `V`)*
|Выражение|Тип|Описание| |Выражение|Тип|Описание|
|-|-|-| |-|-|-|
|`[t1:v1, ..., ti:vi]`|`V[K]`|Литерал ассоциативного массива; `K` определяется по типу `k1`, а `V` по типу `v1` (разделы [2.2.6](../../2/chapter-2-2-6/) и [4.4](../chapter-4-4/))| |`[t1:v1, ..., ti:vi]`|`V[K]`|Литерал ассоциативного массива; `K` определяется по типу `k1`, а `V` по типу `v1` ()|
|`a = b`|`V[K]`|Присваивает ассоциативный массив `b` переменной a типа «ассоциативный массив» ([раздел 4.4.3](../chapter-4-4-3/))| |`a = b`|`V[K]`|Присваивает ассоциативный массив `b` переменной a типа «ассоциативный массив» ()|
|`a[k]`|`V`|Предоставляет доступ к элементу по индексу (если ключ `k` не найден, возникает исключение) ([раздел 4.4.2](../chapter-4-4-2/))| |`a[k]`|`V`|Предоставляет доступ к элементу по индексу (если ключ `k` не найден, возникает исключение) ()|
|`a[k] = v`|`V`|Ставит в соответствие ключу `k` значение `v` (переопределяет предыдущее соответствие, если оно уже было назначено) ([раздел 4.4.2](../chapter-4-4-2/))| |`a[k] = v`|`V`|Ставит в соответствие ключу `k` значение `v` (переопределяет предыдущее соответствие, если оно уже было назначено) ()|
|`k in a`|`V*`|Ищет `k` в `a`, возвращает `null`, если не находит, иначе указатель на значение, ассоциированное с `k` ([раздел 4.4.2](../chapter-4-4-2/))| |`k in a`|`V*`|Ищет `k` в `a`, возвращает `null`, если не находит, иначе указатель на значение, ассоциированное с `k` ()|
|`k !in a`|`bool`|То же, что и `!(k in a)`| |`k !in a`|`bool`|То же, что и `!(k in a)`|
|`a.length`|`размер_t`|Читает значение, соответствующее числу элементов в `a` ([раздел 4.4.1](../chapter-4-4-1/))| |`a.length`|`размер_t`|Читает значение, соответствующее числу элементов в `a` ()|
|`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу (разделы [4.4.4](../chapter-4-4-4/) и [2.3.4.3](../../2/chapter-2-3-4-3/))| |`a is b`|`bool`|Проверяет, идентичны ли массивы друг другу ()|
|`a !is b`|`bool`|То же, что и `!(a is b)`| |`a !is b`|`bool`|То же, что и `!(a is b)`|
|`a == b`|`bool`|Поэлементно сравнивает массивы на равенство (разделы [4.4.4](../chapter-4-4-4/) и [2.3.12](../../2/chapter-2-3-12-1/))| |`a == b`|`bool`|Поэлементно сравнивает массивы на равенство ()|
|`a != b`|`bool`|То же, что и `!(a == b)`| |`a != b`|`bool`|То же, что и `!(a == b)`|
|`a.remove(k)`|`bool`|Удаляет пару с ключом `k`, если такая есть; возвращает `true`, если и только если ключ `k` присутствовал в `a` ([раздел 4.4.5](../chapter-4-4-5/))| |`a.remove(k)`|`bool`|Удаляет пару с ключом `k`, если такая есть; возвращает `true`, если и только если ключ `k` присутствовал в `a` ()|
|`a.dup`|`V[K]`|Создает дубликат ассоциативного массива `a` ([раздел 4.4.3](../chapter-4-4-3/))| |`a.dup`|`V[K]`|Создает дубликат ассоциативного массива `a` ()|
|`a.get(k, v)`|`V`|Возвращает значение из `a`, соответствующее ключу `k`; по умолчанию возвращается значение `v` ([раздел 4.4.2](../chapter-4-4-2/))| |`a.get(k, v)`|`V`|Возвращает значение из `a`, соответствующее ключу `k`; по умолчанию возвращается значение `v` ()|
|`a.byKey()`|`int delegate(int delegate(ref K))`|Возвращает делегат, пригодный для использования в цикле `foreach` для итерации по ключам| |`a.byKey()`|`int delegate(int delegate(ref K))`|Возвращает делегат, пригодный для использования в цикле `foreach` для итерации по ключам|
|`a.byValue()`|`int delegate(int delegate(ref V))`|Возвращает делегат, пригодный для использования в цикле `foreach` для итерации по значениям| |`a.byValue()`|`int delegate(int delegate(ref V))`|Возвращает делегат, пригодный для использования в цикле `foreach` для итерации по значениям|
@ -1308,6 +1308,4 @@ y += 100; // Хм...
[^3]: При этом для массива типа `V[K]` передаваемые ключи должны иметь тип `immutable(K)` или неявно приводимый к нему. Это требование введено для того, чтобы в процессе работы программы значение ключа не могло быть изменено косвенным образом, что повлекло бы нарушение структуры ассоциативного массива. *Прим. науч. ред.* [^3]: При этом для массива типа `V[K]` передаваемые ключи должны иметь тип `immutable(K)` или неявно приводимый к нему. Это требование введено для того, чтобы в процессе работы программы значение ключа не могло быть изменено косвенным образом, что повлекло бы нарушение структуры ассоциативного массива. *Прим. науч. ред.*
[^4]: Как уже говорилось, оператор `in` возвращает указатель на элемент, соответствующий ключу, или `null`, если такой ключ отсутствует в массиве. *Прим. науч. ред.* [^4]: Как уже говорилось, оператор `in` возвращает указатель на элемент, соответствующий ключу, или `null`, если такой ключ отсутствует в массиве. *Прим. науч. ред.*
[^5]: Кембрийский взрыв неожиданное появление в раннекембрийских отложениях окаменелостей представителей многих подразделений животного царства на фоне отсутствия их окаменелостей или окаменелостей их предков в докембрийских отложениях. *Прим. пер.* [^5]: Кембрийский взрыв неожиданное появление в раннекембрийских отложениях окаменелостей представителей многих подразделений животного царства на фоне отсутствия их окаменелостей или окаменелостей их предков в докембрийских отложениях. *Прим. пер.*
[^6]: В архитектуре x86 тип указатель размером в 4 байта соответствует двойно [^6]: В архитектуре x86 тип указатель размером в 4 байта соответствует двойному слову (`DW`), а слову соответствует тип `short` размером 2 байта. *Прим. науч. ред.*
му слову (DW), а слову соответствует тип short размером 2 байта. Прим. на
уч. ред.