gpt4 book ai didi

syntax - 如何定义带有参数和返回类型(如 Fn)的特征?

转载 作者:行者123 更新时间:2023-11-29 07:58:06 26 4
gpt4 key购买 nike

我对以下代码 ( Listing 13-9 ) 感到困惑:

struct Cacher<T>
where
T: Fn(i32) -> i32,
{
calculation: T,
value: Option<i32>,
}

我明白 Fn是一个特征,但通常特征没有参数和返回类型。我如何定义像 Fn 这样的特征?

我试着看at the definition (实际上它是 FnOnce ,但是 FnFnMut 绑定(bind)和 FnMutFnOnce 绑定(bind)......),但我仍然感到困惑。那<Args>是什么意思?然后还有something written about it in the Nomicon ;但我不明白:

Where Fn(a, b, c) -> d is itself just sugar for the unstable real Fn trait

最佳答案

How can I define a trait with arguments and return types like Fn?

如果您指的是语法 MyTrait(A) -> B , 你不能。具有“参数”和“返回类型”的特征是特殊的并且仅限于 Fn , FnMutFnOnce特质。这是硬编码到编译器中的。甚至还有一条特定的错误消息:

error: parenthetical notation is only stable when used with `Fn`-family traits (see issue #29625)
--> src/main.rs:5:8
|
5 | A: MyTrait(A) -> B,
| ^^^^^^^^^^^^^^^

话虽这么说,这个语法脱糖成了标准的特征语法。你可以看到什么FnOnce来自文档:

pub trait FnOnce<Args> {
type Output;
extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}

编译器转换Fn(A, B, C) -> Z进入Fn<(A, B, C), Output = Z> . Args是一个标准特征泛型类型参数并且 Output是标准关联类型。 "rust-call" ABI 是一些内部编译器机制,可以使它更有效,并且在大多数情况下可以忽略。

您完全可以使用通用参数和关联类型创建自己的特征。您只是不允许使用括号符号。

关于syntax - 如何定义带有参数和返回类型(如 Fn)的特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46615275/

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