Нет гарантии, что постоянные значения вычисляются во время компиляции. Компилятор знает , если значение переполнено, потому что он выполнил вычисление.
Я понимаю, что rustc
беспокоится о том, что вычитание usize
типов может привести к переполнению, но я могу гарантировать что N_CELLS
всегда будет положительным в этом случае.
Как я могу взять на себя ответственность за это и заставить rustc
довериться мне?
Вы не можете гарантировать это (и компилятор не должен вам доверять) потому что вы не правы . ^
означает XOR, а не «во власть». Компилятор выполнил ваш код и вычитал буквально ниже нуля, вызывая ошибку. Это не гипотетически:
((2 * n) ^ 2) = 4
n * (n + 1) = 12
4 - 12 = -8
fn main() {
let n: usize = 3;
let n_cells: usize = ((2 * n) ^ 2) - n * (n + 1);
}
thread 'main' panicked at 'attempt to subtract with overflow', src/main.rs:3:26
См. Также:
К сожалению, в настоящее время вы не можете использовать pow
в константе:
const N: usize = 3;
const N_CELLS: usize = ((2 * N + 1).pow(2)) - N * (N + 1);
error[E0015]: calls in constants are limited to constant functions, tuple structs and tuple variants
--> src/lib.rs:2:24
|
2 | const N_CELLS: usize = ((2 * N + 1).pow(2)) - N * (N + 1);
| ^^^^^^^^^^^^^^^^^^^^
Вы должны будете расширить умножение самостоятельно:
const N_CELLS: usize = {
let a = 2 * N + 1;
let b = N * (N + 1);
a * a - b
};