是否有可能编写一个折叠迭代器的const函数?当我尝试:
const fn foo(s: &str) -> u64 {
return s.chars().fold(0, |accumulator, char| -> u64 {
return accumulator ^ (char as u64);
});
}
我收到编译器错误:
error: function pointers in const fn are unstable
--> src/lib.rs:2:30
|
2 | return s.chars().fold(0, |accumulator, char| -> u64 {
| ______________________________^
3 | | return accumulator ^ (char as u64);
4 | | });
| |_____^
我假设我的匿名函数|x, y| -> x { ... }
作为函数指针传递给fold()
,这就是导致错误的原因。
有什么样的const lambda我可以在这里传递给fold
,或者我可以只使用for循环并将结果累积到一个可变变量中,然后我从foo
函数返回?我绝对没有Rust经验......
不,你不能在稳定的Rust 1.33中做到这一点。你需要使你的函数非const:
fn foo(s: &str) -> u64 {
s.chars().fold(0, |accumulator, char| {
accumulator ^ (char as u64)
})
}
注意我删除了显式的return
关键字和闭包返回类型是惯用的。
也可以看看:
如果你在夜间Rust尝试这个:
#![feature(const_fn)]
const fn foo(s: &str) -> u64 {
s.chars().fold(0, |accumulator, char| {
accumulator ^ (char as u64)
})
}
你会得到一个不同的错误:
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
--> src/lib.rs:4:5
|
4 | s.chars().fold(0, |accumulator, char| {
| ^^^^^^^^^
error[E0015]: calls in constant functions are limited to constant functions, tuple structs and tuple variants
--> src/lib.rs:4:5
|
4 | / s.chars().fold(0, |accumulator, char| {
5 | | accumulator ^ (char as u64)
6 | | })
| |______^
调用Iterator::fold
需要对the original const fn
RFC 911进行几次扩展才能实现。例如,原始RFC明确禁止它:
特征,特质实施及其方法不能是
const
由于闭包是作为由特征支持的泛型实现的,因此我不会立即看到它们可以出于同样的原因而轻松实现。