是否可以编写一个在迭代器上折叠的const函数?当我尝试:
const fn foo(s: &str) -> u64 {
return s.chars().fold(0, |accumulator, char| -> u64 {
return accumulator ^ (char as u64);
});
}
Run Code Online (Sandbox Code Playgroud)
我收到编译器错误:
const fn foo(s: &str) -> u64 {
return s.chars().fold(0, |accumulator, char| -> u64 {
return accumulator ^ (char as u64);
});
}
Run Code Online (Sandbox Code Playgroud)
我想我的匿名函数|x, y| -> x { ... }
是作为函数指针传递给的fold()
,这就是导致错误的原因。
我可以传递给fold
这里某种类型的const lambda吗,还是可以只使用for循环并在可变变量中累积结果,然后从foo
函数中返回?我完全没有Rust的经验...
不,您不能在稳定的Rust 1.33中执行此操作。您将需要使函数为非常量:
fn foo(s: &str) -> u64 {
s.chars().fold(0, |accumulator, char| {
accumulator ^ (char as u64)
})
}
Run Code Online (Sandbox Code Playgroud)
注意我删除了显式return
关键字和闭包返回类型,这是惯用的。
也可以看看:
如果您在每晚的Rust中尝试此操作:
#![feature(const_fn)]
const fn foo(s: &str) -> u64 {
s.chars().fold(0, |accumulator, char| {
accumulator ^ (char as u64)
})
}
Run Code Online (Sandbox Code Playgroud)
您会收到其他错误:
fn foo(s: &str) -> u64 {
s.chars().fold(0, |accumulator, char| {
accumulator ^ (char as u64)
})
}
Run Code Online (Sandbox Code Playgroud)
调用Iterator::fold
需要对原始const fn
RFC 911进行几个扩展。例如,原始RFC明确禁止使用它:
特性,特质实现及其方法不能
const
由于闭包是作为具有特征支持的泛型实现的,因此我并没有立即看到由于相同的原因而可以轻松实现闭包。
归档时间: |
|
查看次数: |
381 次 |
最近记录: |