Types 如何在指针类型上编写通用函数?

Types 如何在指针类型上编写通用函数?,types,rust,Types,Rust,在中,我们具有以下功能: fn over<X, F>(left: &[X], right: &[X], mut eq_fn: F) -> bool where F: FnMut(&X, &X) -> bool { left.len() == right.len() && left.iter().zip(right).all(|(x, y)| eq_fn(x, y)) } fn o

在中,我们具有以下功能:

fn over<X, F>(left: &[X], right: &[X], mut eq_fn: F) -> bool 
        where F: FnMut(&X, &X) -> bool {
    left.len() == right.len() && left.iter().zip(right).all(|(x, y)| 
        eq_fn(x, y))
}
fn over(左:&[X],右:&[X],多个等式fn:F)->bool
其中F:FnMut(&X,&X)->bool{
left.len()==right.len()&&left.iter().zip(right).all(|(x,y)|
等式(x,y))
}
碰巧,
rustc
的AST表示使用了大量的
语法::ptr::p
指针。如果我们使用闭包,那些对T的去引用,因此autoderef隐式地将它们强制为
&T
。但是,如果尝试使用普通的
fn
,则会出现类型不匹配:

错误:类型不匹配:类型`fn(&syntax::ast::Expr,&syntax::ast::Expr)->bool{eq_op::is_exp_equal}`实现了特性`for core::ops::FnMut`,但需要特性`for core::ops::FnMut`(预期结构`syntax::ptr::p`,找到结构`syntax::ast::Expr`)[E0281]


我是否可以将上述函数更改为同时接受
&[&T]
&[p]
并自动将
p
强制为
&Expr
?如果是,如何实现?

&T
p
实现
Deref
,因此您可以在自己的范围内使用它:

use std::ops::Deref;

fn over<X, F, X1, X2>(left: &[X1], right: &[X2], mut eq_fn: F) -> bool 
        where X1: Deref<Target = X>,
              X2: Deref<Target = X>,
              F: FnMut(&X, &X) -> bool {
    left.len() == right.len() && left.iter().zip(right).all(|(x, y)| 
        eq_fn(x, y))
}
使用std::ops::Deref;
fn在(左:&[X1],右:&[X2],多个eq_fn:F)->bool
其中X1:Deref,
X2:Deref,
F:FnMut(&X,&X)->bool{
left.len()==right.len()&&left.iter().zip(right).all(|(x,y)|
等式(x,y))
}