error[E0015]: cannot call non-const function `my_func` in constants
error[E0015]: cannot use `for` loop on `std::ops::RangeInclusive<u32>` in constant functions
const 文脈で非 const 関数を使用した。
単純に const 文脈で非 const 関数を使用している。
fn main() {
const VAL: i32 = my_func(3, 2);
assert_eq!(VAL, 5);
}
fn my_func(x: i32, y: i32) -> i32 {
x + y
}
error[E0015]: cannot call non-const function `my_func` in constants --> src\main.rs:2:22 | 2 | const VAL: i32 = my_func(3, 2); | ^^^^^^^^^^^^^ | = note: calls in constants are limited to constant functions, tuple structs and tuple variants
for ループ
const 文脈中で for ループ構文を使用している。
これは不可能である。なぜなら、for ループ構文の in の対象には IntoIterator トレイトを実装した型が必要になる。そして、IntoIterator の各メソッドは const 関数ではない。
以下では、5 の階乗を計算している。
fn main() {
assert_eq!(fact(5), 120);
}
const fn fact(n: u32) -> u32 {
let mut ret = 1;
for i in 1..=n {
ret *= i;
}
ret
}
error[E0015]: cannot use `for` loop on `std::ops::RangeInclusive<u32>` in constant functions
--> src\main.rs:7:14
|
7 | for i in 1..=n {
| ^^^^^
|
= note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
for 構文は使えないが、while や loop は使える。
fn main() {
assert_eq!(fact(5), 120);
}
const fn fact(n: u32) -> u32 {
let mut ret = 1;
let mut i = 1;
while i <= n {
ret *= i;
i += 1;
}
ret
}