是否可以编写一个在迭代器上折叠的const函数?

Las*_*ssi 1 const rust

是否可以编写一个在迭代器上折叠的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的经验...

She*_*ter 5

不,您不能在稳定的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 fnRFC 911进行几个扩展。例如,原始RFC明确禁止使用它:

特性,特质实现及其方法不能 const

由于闭包是作为具有特征支持的泛型实现的,因此我并没有立即看到由于相同的原因而可以轻松实现闭包。


归档时间:

查看次数:

381 次

最近记录:

6 年,6 月 前