Как инициализировать статический массив с большинством значений одинаковых, но некоторые значения разные? - PullRequest
0 голосов
/ 11 мая 2018

Я хотел бы использовать статический или константный массив, но инициализировать его, используя что-то отличное от синтаксиса [T; N]. Мне нужно определить конкретные элементы, но все остальные значения могут по умолчанию равны 0 или некоторым другим значениям.

В C вы можете сделать следующее:

byte ARRAY[256] = {
    [0x1F] = (1 << 4),
    // Or even simply just this
    [0x46] '\n'
};

Я пробовал что-то вроде:

static ARRAY: [u8; 256] = {
    // x is some arbitrary number of elements
    let mut array = [0, x];
    array[i] = 'b',
    array[j] = 'a',
    array[k] = 'd',
    array
};

Это был просто метод проб и ошибок, основанный на синтаксисе, который я знаю, чтобы работать для объявлений локальных массивов. Это приводит к ошибке компилятора о том, что блоки в const и static ограничены элементами и хвостовыми выражениями. Я знаю, что если я заключу определение массива в скобки, то последняя строка или последнее выражение должны быть неявным возвращением.

Кроме того, у меня нет доступа к библиотеке std, но я не думаю, что сложная структура была бы необходима для чего-то такого простого - для индексации и получения значения.

Я посмотрел на правила макросов Rust и думаю, что это может быть решением, но все примеры, которые я видел, являются итеративными и инкрементальными.

1 Ответ

0 голосов
/ 11 мая 2018

Не существует эквивалента Rust для вашего фрагмента C. Документация показывает, что допускаются только 3 простых шаблона:

  1. пусто
  2. значение, значение, значение и т. Д. *
  3. значение; размер

Итак, в настоящее время с синтаксисом массива вы не можете этого сделать.

Теперь давайте взглянем на решение для макроса. Нет способа «посчитать», поэтому, если вы не напишите плагин для компилятора Rust, вы не сможете сделать это с помощью макроса.

Мое предпочтительное решение было бы создать файл с другими инструментами перед компиляцией. Например, вы можете использовать Cargo для генерации файла перед компиляцией.


Может быть решение в будущем. RFC о функции const может предложить возможность делать то, что вы хотите во время компиляции, но в настоящее время это невозможно.

...