Templates 如何对泛型使用括号?

Templates 如何对泛型使用括号?,templates,generics,call,rust,lifetime,Templates,Generics,Call,Rust,Lifetime,我得到了编译错误: 当与Fn性状家族一起使用时,尖括号符号不稳定,请使用括号[E0215] 这是什么意思?如何“使用括号” 使用std::hash::hash; 使用std::collections::HashMap; 结构记忆乐趣{ 乐趣:fn&A)->R, map:HashMap, } fn memoize(乐趣:fn&A)->R)->MemoedFun{ 记忆乐趣{ 乐趣:乐趣, 映射:HashMap::new(), } } impl您的代码有几个问题 首先,你不能在稳定锈病中直接使用Fn

我得到了编译错误:

当与
Fn
性状家族一起使用时,尖括号符号不稳定,请使用括号[E0215]

这是什么意思?如何“使用括号”

使用std::hash::hash;
使用std::collections::HashMap;
结构记忆乐趣{
乐趣:fn&A)->R,
map:HashMap,
}
fn memoize(乐趣:fn&A)->R)->MemoedFun{
记忆乐趣{
乐趣:乐趣,
映射:HashMap::new(),
}
}

impl您的代码有几个问题

首先,你不能在稳定锈病中直接使用
Fn*
性状。这包括1)使用尖括号表示法,以及2)实现这些特性。不过,在不稳定锈蚀中,可以为这两种情况启用功能标志

第二,如果使用尖括号表示闭包特征,则必须使用元组表示参数,即使只有一个参数:

FnOnce<(A,)>
最后,要使用此回忆录,您必须编写的结果代码并不漂亮。由于某些原因,您不能在“函数”上使用函数语法,因此您需要直接使用
call\u once()

fn computer(x: &i32) -> i32 {
    println!("Computing for {}", x);
    -*x
}

let mut f = memoize(computer);

println!("f(10): {}", (&mut f).call_once((10,)));
println!("f(10): {}", (&mut f).call_once((10,)));
println!("f(42): {}", (&mut f).call_once((42,)));
(试试看)


毕竟,
Fn*
traits手动实现不稳定是有原因的。

这个误导性错误消息是否存在锈菌缺陷?我无法通过简单的搜索找到任何东西,我也没有找到,所以我想创建一个是有意义的。FnOnce(t,U)->V是什么意思?我找不到这种语法的描述。输出是一个特殊的关键字吗?哦,我现在明白了。你并没有在我以为你的地方使用FnOnce(T,U)->V。这就是结果函数的类型。@dspyz,
FnOnce(T,U)->V
是闭包特征边界的语法,在中的书中有描述<
FnOnce
中的code>Output
是一种用于在特征边界中指定关联类型的语法,也对其进行了描述。
impl<'a, A: Eq + Hash, R> FnOnce<(A,)> for &'a mut MemoedFun<A, R> {
    type Output = &'a R;

    extern "rust-call" fn call_once(self, (arg,): (A,)) -> &'a R {
        if self.map.contains_key(&arg) {
            &self.map[&arg]
        } else {
            let r = (self.fun)(&arg);
            self.map.entry(arg).or_insert(r)
        }
    }
}
fn computer(x: &i32) -> i32 {
    println!("Computing for {}", x);
    -*x
}

let mut f = memoize(computer);

println!("f(10): {}", (&mut f).call_once((10,)));
println!("f(10): {}", (&mut f).call_once((10,)));
println!("f(42): {}", (&mut f).call_once((42,)));