如何定义一个带参数和返回类型的特征,如Fn?
问题描述:
我很困惑通过下面的代码(Listing 13-9):如何定义一个带参数和返回类型的特征,如Fn?
struct Cacher<T>
where
T: Fn(i32) -> i32,
{
calculation: T,
value: Option<i32>,
}
我明白Fn
是一个特点,但通常一个特点没有参数和返回类型。我如何定义像Fn
这样的特征?
我想看看at the definition(实际上这是FnOnce
,但Fn
有FnMut
约束和FnMut
已FnOnce
束缚...),但我仍然感到困惑。 <Args>
是什么意思?那么也something written about it in the Nomicon;但我不明白:
哪里
Fn(a, b, c) -> d
本身就是不稳定真正Fn
特质
答
只是糖我如何定义带有参数的特征和返回类型,如FN?
如果您的意思是语法MyTrait(A) -> B
,您不能。具有“参数”和“返回类型”的特征是特殊的,并且限于Fn
,FnMut
和FnOnce
特征。这是硬编码到编译器中的。甚至还有一个特定的错误消息是:
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,
| ^^^^^^^^^^^^^^^
话虽这么说,这句法desugars到标准特征语法。你可以看到什么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
是标准关联类型。 ABI是一些内部编译器机制,它使得这个机制更高效一些,大部分时间都可以忽略。
您完全可以使用通用参数和关联类型创建自己的特征。你只是不允许使用括号。