Syntax 如何使用参数和返回类型(如Fn)定义特征?

Syntax 如何使用参数和返回类型(如Fn)定义特征?,syntax,rust,closures,traits,Syntax,Rust,Closures,Traits,我被以下代码()弄糊涂了: 结构缓存器 哪里 T:Fn(i32)->i32, { 计算:T, 价值:期权, } 我知道Fn是一个trait,但通常trait没有参数和返回类型。我如何定义像Fn这样的特质 我试着看(实际上是FnOnce,但是Fn有FnMut绑定,FnMut有FnOnce绑定…),但我还是很困惑。那是什么意思;但我不明白: 其中,Fn(a,b,c)->d本身就是不稳定的真实Fn特征的糖 如何使用参数和返回类型(如Fn)定义特征 如果您指的是语法MyTrait(A)->B,则不能。

我被以下代码()弄糊涂了:

结构缓存器 哪里 T:Fn(i32)->i32, { 计算:T, 价值:期权, } 我知道
Fn
是一个trait,但通常trait没有参数和返回类型。我如何定义像
Fn
这样的特质

我试着看(实际上是
FnOnce
,但是
Fn
FnMut
绑定,
FnMut
FnOnce
绑定…),但我还是很困惑。那
是什么意思;但我不明白:

其中,
Fn(a,b,c)->d本身就是不稳定的真实
Fn
特征的糖

如何使用参数和返回类型(如Fn)定义特征

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

错误:插入符号仅在与“Fn”-家族特征一起使用时才稳定(见第29625期)
-->src/main.rs:5:8
|
5 | A:MyTrait(A)->B,
|        ^^^^^^^^^^^^^^^

也就是说,这种语法被分解为标准的trait语法。您可以从文档中看到
FnOnce
是什么:

pub trait FnOnce<Args> {
    type Output;
    extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}
发布一次{
类型输出;
extern“rust call”fn call_once(self,args:args)->self::Output;
}
编译器将
Fn(A,B,C)->Z
转换为
Fn
Args
是标准的trait泛型类型参数,
Output
是标准的关联类型。
“rust call”
ABI是一种内部编译器机制,它使这一机制更加高效,并且在大多数情况下可以忽略


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

嘿,这个错误消息可以修改成更通俗的说法吗?类似于你在一个特征中使用了
()
,而你本应该使用
?'“插入符号”对我来说意味着diddy@JGFMK鼓励您将此类事项的问题提交到。
pub trait FnOnce<Args> {
    type Output;
    extern "rust-call" fn call_once(self, args: Args) -> Self::Output;
}