From 916940b95f9d5845629b3094ec36c484bb70af3c Mon Sep 17 00:00:00 2001 From: Alexander Date: Mon, 6 Feb 2023 00:31:53 +0300 Subject: [PATCH] =?UTF-8?q?4=20=D0=B3=D0=BB=D0=B0=D0=B2=D0=B0=20fix=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 88 +++++++++---------- 1 file changed, 43 insertions(+), 45 deletions(-) diff --git a/04-массивы-ассоциативные-массивы-и-строки/README.md b/04-массивы-ассоциативные-массивы-и-строки/README.md index 77f0e44..459fa06 100644 --- a/04-массивы-ассоциативные-массивы-и-строки/README.md +++ b/04-массивы-ассоциативные-массивы-и-строки/README.md @@ -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 байта. – *Прим. науч. ред.*