gpt4 book ai didi

rust - 如何在 Rust 中使用返回类型为 `Fn` 的 `impl trait` 特征?

转载 作者:行者123 更新时间:2023-12-03 11:39:58 25 4
gpt4 key购买 nike

我想使用 Fn返回类型为 impl Trait 的特征.
例如:

let funcs: [&Fn(&str) -> impl Iterator<Item = &str>] =
[&str::split_whitespace, &str::split_ascii_whitespace];

但是,无法使用以下错误消息编译此代码:
`impl Trait` not allowed outside of function and inherent method return types

我应该怎么做?

最佳答案

str::split_whitespace str::split_ascii_whitespace 有不同的返回类型。你不能构造一个不同类型的数组。相反,您可以创建 boxed trait objects 的数组。 .这将执行动态调度,其中调用的特定方法是在运行时确定的(而不是静态调度,这是在编译时知道特定方法版本的地方)

本质上,目标是让所有函数的签名为:

for<'a> fn(&'a str) -> Box<dyn Iterator<Item=&'a str> + 'a>

这是一个接受 &str 的函数并在 &str 上返回一些迭代器s 在运行时确定。

现在,这就是它开始变得困惑的地方,我希望有人能提出一个更好的方法来做到这一点。

使其工作的一种方法是在 str::split_whitespace 周围创建包装函数。和 str::split_ascii_whitespace返回一个盒装特征而不是它们各自的 SplitWhitespaceSplitAsciiWhitespace结构。我使用了一个辅助宏来简单地将函数调用的返回值包装在一个 Box 中
macro_rules! boxed_return {
($fn_new:ident, $fn:path) => {
fn $fn_new<'a>(s: &'a str) -> Box<dyn Iterator<Item=&'a str> + 'a> {
Box::new($fn(s))
}
}
}

boxed_return!(split_whitespace_wrapper, str::split_whitespace);
boxed_return!(split_ascii_whitespace_wrapper, str::split_ascii_whitespace);

然后我们可以简单地创建拆分器函数数组,如下所示
let funcs = [split_whitespace_wrapper, split_ascii_whitespace_wrapper];

关于rust - 如何在 Rust 中使用返回类型为 `Fn` 的 `impl trait` 特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59535042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com