2017-10-06 78 views
3

我很困惑通过下面的代码(Listing 13-9):如何定义一个带参数和返回类型的特征,如Fn?

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

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

我想看看at the definition(实际上这是FnOnce,但FnFnMut约束和FnMutFnOnce束缚...),但我仍然感到困惑。 <Args>是什么意思?那么也something written about it in the Nomicon;但我不明白:

哪里Fn(a, b, c) -> d本身就是不稳定真正Fn特质

回答

5

只是糖我如何定义带有参数的特征和返回类型,如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, 
    |  ^^^^^^^^^^^^^^^ 

话虽这么说,这句法desugars到标准特征语法。你可以看到什么FnOnce是从文档:

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

编译器转换成Fn(A, B, C) -> ZFn<(A, B, C), Output = Z>Args是一个标准特征泛型类型参数,并且Output是标准关联类型。 ABI是一些内部编译器机制,它使得这个机制更高效一些,大部分时间都可以忽略。

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

相关问题