Мне нужно отправить несколько сообщений (в виде векторов), и они должны быть одинаковой длины. Я хочу заполнить векторы нулями, если они имеют неправильную длину.
Допустим, нам нужно, чтобы все полезные нагрузки имели длину 100. Я подумал, что могу использовать функцию extend
и сделать что-то вроде этого:
let len = 100;
let mut msg = &[1,23,34].to_vec();
let diff : usize = msg.len()-len;
let padding = [0;diff].to_vec();
msg.extend(padding);
Однако это не скомпилируется, так как компилятор жалуется, что diff
не является константой. Но также это кажется довольно многословным, чтобы сделать эту простую вещь, которую мы пытаемся сделать.
Есть ли хороший и лаконичный способ сделать это?
Вы можете исправить свой код с помощью std::iter::repeat()
:
let len = 100;
let mut msg = vec![1, 23, 34];
let diff = len - msg.len();
msg.extend(std::iter::repeat(0).take(diff));
Но есть способ намного лучше — Vec::resize()
— это то, что вам нужно:
let len = 100;
let mut msg = vec![1, 23, 34];
msg.resize(len, 0);
FWIW
[0;diff].to_vec()
помимо того, что не работает (поскольку размер массивов должен быть известен при размере компиляции), слишком сложен: макросvec!
может принимать размер времени выполнения, поэтомуvec![0;diff]
выполнил бы свою работу. Хотя ответы Хаима все же гораздо предпочтительнее.