如何在指针类型上编写泛型函数?

llo*_*giq 5 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))
}
Run Code Online (Sandbox Code Playgroud)

碰巧,rustcAST表示使用了很多syntax::ptr::P<T>指针.那些取消引用T,因此&T如果我们使用闭包,autoderef会隐式强制它们.fn但是,如果我们尝试使用普通,我们会遇到类型不匹配:

error: type mismatch: the type `fn(&syntax::ast::Expr, &syntax::ast::Expr) -> bool {eq_op::is_exp_equal}` implements the trait `for<'r, 'r> core::ops::FnMut<(&'r syntax::ast::Expr, &'r syntax::ast::Expr)>`, but the trait `for<'r, 'r> core::ops::FnMut<(&'r syntax::ptr::P<syntax::ast::Expr>, &'r syntax::ptr::P<syntax::ast::Expr>)>` is required (expected struct `syntax::ptr::P`, found struct `syntax::ast::Expr`) [E0281]

我可以改变上面的功能,同时接受&[&T]&[P<T>]自动强制P<Expr>&Expr?如果是这样,怎么样?

Chr*_*gan 9

无论&TP<T>实施Deref<Target = T>,所以在你的边界,你可以使用:

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))
}
Run Code Online (Sandbox Code Playgroud)