"D"iving Into the D Programming Language / Погружение в язык Ди: 1.4.1 Building a Vocabulary
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Например, давайте напишем простую программу по такому условию: Born2frag86 10.01.14 в 06:09 |
|
|
Считать текст состоящий из слов разделенных пробелами, и присвоить уникальный номер каждому отдельному слову. Вывести строки в таком виде: ID слово. Born2frag86 10.01.14 в 06:12 |
||
|
Этот маленький скрипт будет полезен если тебе необходимо произвести некоторые операции над текстом; создав словарь один раз, тебе нужно будет манипулировать только номерами, а не целыми словами. Born2frag86 10.01.14 в 06:15 |
||
|
Возможный подход к созданию такого словаря - накапливать уже пройденные (просмотренные) слова в такую разновидность словаря соотносящего слова целым числам. Born2frag86 10.01.14 в 06:17 |
||
|
При добавлении нового соответствия нам только необходимо убедиться в том, что целое число уникально ( надежный выбор - использовать текущую длину словаря равную ID 0, 1, 2, ...). Born2frag86 10.01.14 в 06:21 |
||
|
Давайте посмотрим как это можно сделать на D. Born2frag86 10.01.14 в 06:22 |
||
|
import std.stdio, std.string; Born2frag86 10.01.14 в 06:24 |
||
|
В D, тип ассоциативного массива (хэш-таблицы), который соотносит значения типа K со значениями типа V, обозначается как V [K] . Born2frag86 10.01.14 в 06:26 |
||
|
Так что словарь типа uint [ string ] соотносящий строки с беззнаковыми целыми числами - как раз то что нам нужно для хранения связей слово-ID. Born2frag86 10.01.14 в 06:29 |
||
|
Выражение "word in dictionary" будет ненулевым, если ключ из word будет найден в словаре dictionary. И наконец, вставка в словарь делается при помощи "dictionary[word] = newlD". thornik 01.08.14 в 16:20 |
||
|
Хотя это не сделано явно в программе выше, тип string на самом деле массив символов. Вообще, массивы с изменяемой длиной обозначаются как T[] и инициализируются несколькими способами: thornik 01.08.14 в 16:23 |
||
|
int[] a = new int[20]; // Целочисленный массив заполненный 20 нулями. Born2frag86 05.03.14 в 09:30 |
||
|
В отличии от массивов в "C", в языке "D" массивы знают собственную длину, которую можно получить через свойство массива length. Присваивание же свойству length перераспределяет память под массив на указанную длину. thornik 01.08.14 в 16:26 |
||
|
Доступ к массиву всегда сопровождается проверкой выхода за пределы. Код, который не боится риска выйти за границы массива, может получить указатель этого массива (через свойство arr.ptr) и затем использовать адресную арифметику без каких-либо проверок со стороны "D". thornik 01.08.14 в 16:29 |
||
|
Есть также опция компилятора, отключающая проверку границ, если вам нужно выжать максимум производительности из чипа. Это позволяет иметь код, который безопасный по-умолчанию, но который может быть сделан более быстрым с чуть большими усилиями. thornik 01.08.14 в 16:34 |
||
|
Вот так можно перебрать элементы массива, используя новую форму уже знакомого оператора foreach: thornik 01.08.14 в 16:35 |
||
|
int[] arr = new int[20]; thornik 01.08.14 в 16:36 |
||
|
Цикл выше связывает переменную elem с каждым элементом массива. Однако, присвоение elem нового значения не изменяет сам элемент массива - для этого нужно объявить elem с ключевым словом ref: thornik 01.08.14 в 16:38 |
||
|
// Обнулить все элементы arr thornik 01.08.14 в 16:39 |
||
|
Иногда нужно иметь не только элемент массива, но и его индекс - foreach может и это: thornik 01.08.14 в 16:40 |
||
|
int[] months = new int[12]; thornik 01.08.14 в 16:41 |
||
|
Код выше создаёт массив чисел 1, 2, ..., 12. Этот цикл эквивалентен слегка более развёрнутому коду ниже: thornik 01.08.14 в 16:43 |
||
|
foreach (i; 0 .. months.length) { thornik 01.08.14 в 16:43 |
||
|
В D можно создавать и массивы фиксированной длины (статические массивы): например, int[5] - массив из 5 целых и неизменяемой длиной. thornik 01.08.14 в 16:45 |
||
|
Массивы обладают семантикой "поверхностной копии", т.е. присвоение переменной одного массива другой, не создаёт отдельной копии - теперь просто два имени ссылаются на один и тот же участок памяти. Если всё же нужна копия, нужно воспользоваться свойством массива dup: thornik 01.08.14 в 16:57 |
||
|
int[] a = new int[100]; thornik 01.08.14 в 16:59 |
