是否有可能编写一个折叠迭代器的const函数?

问题描述 投票:0回答:1

是否有可能编写一个折叠迭代器的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 const
1个回答
4
投票

不,你不能在稳定的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

由于闭包是作为由特征支持的泛型实现的,因此我不会立即看到它们可以出于同样的原因而轻松实现。

© www.soinside.com 2019 - 2024. All rights reserved.