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