2015-07-15 10 views
5

In rust-clippy haben wir die following Funktion:Wie schreibe ich eine generische Funktion über den Zeigertyp?

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)) 
} 

Wie es passiert, rustc ‚s AST Darstellung viel syntax::ptr::P<T> Zeiger verwendet. Diese Dereferenzierung von T, und so autogeref impliziert sie zwangsweise zu &T, wenn wir eine Schließung verwenden. Wenn wir versuchen, aber eine einfache fn zu verwenden, erhalten wir eine Typenkonflikt:

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]

Kann ich die obige Funktion verändern sowohl &[&T] und &[P<T>] und automatisch P<Expr> in &Expr zwingen zu akzeptieren? Wenn das so ist, wie?

Antwort

9

Sowohl &T und P<T>Deref<Target = T> implementieren, so dass Sie, dass in Ihrer Grenze verwenden:

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)) 
} 
Verwandte Themen