gpt4 book ai didi

syntax - 有什么方法可以创建特定 FnMut 的别名吗?

转载 作者:行者123 更新时间:2023-11-29 07:50:35 30 4
gpt4 key购买 nike

我想使用 FnMut(&[f32]) -> f32,为了不复制/粘贴完整签名,我想引入某种别名,但是

type Boo = FnMut(&[f32]) -> f32;

fn f<F: Boo>(mut f: F) {}

导致编译错误:

error[E0404]: expected trait, found type alias `Boo`
--> src/main.rs:3:13
|
3 | fn f<F: Boo>(mut f: F) {}
| ^^^ type aliases cannot be used for traits

然后我尝试了:

trait Boo: FnMut(&[f32]) -> f32 {}

fn f<F: Boo>(mut f: F) {}

它已编译,但如果我尝试在另一个地方使用 Boo 代替 trait:

trait Boo: FnMut(&[f32]) -> f32 {}

struct X(Vec<Box<Boo>>);

我得到:

error[E0191]: the value of the associated type `Output` (from the trait `std::ops::FnOnce`) must be specified
--> src/main.rs:3:18
|
3 | struct X(Vec<Box<Boo>>);
| ^^^ missing associated type `Output` value

有什么方法可以创建我可以使用的特定 FnMut 的别名而不是 FnMut(&[f32]) -> f32?

最佳答案

Trait 别名目前不是语言的一部分。但是,有一个 accepted RFC为此。很难准确预测何时实现,但接受 RFC 代表 promise 在未来某个时间点实现。

错误的原因是您的 Boo 特征是 FnMut 的子类型,任何实现还必须提供所需的关联类型 Output .但是编译器仍然不知道将提供哪个实现,所以你需要告诉它 Output 的类型是什么:

struct X(Vec<Box<Boo<Output = f32>>>);

这有点笨拙,我觉得这是一个需要改进的地方。直觉上,Output 似乎可以从 -> f32 推断出来,但我在这里可能是错的。

即使修复了该错误,Boo 严格来说是 FnMut(&[f32]) 的子类型,因此您不能只提供任何闭包,其中 Boo 是预期的。该闭包还必须实现您的特征。您可以将此作为所有 FnMut(&[f32]) -> f32 的整体实现,如下所示:

impl <F> Boo for F where F: FnMut(&[f32]) -> f32 {}

现在任何 Boo 都是 FnMut(&[f32]) -> f32(通过子类型),任何 FnMut(&[f32]) -> f32 是一个 Boo(通过整体实现)。

关于syntax - 有什么方法可以创建特定 FnMut 的别名吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44246722/

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