2017-08-06 4 views
8

Je souhaite écrire une fonction générique acceptant tout type de chaîne (&str/String) pour des raisons de commodité.Fonction générique acceptant & str ou déplacement Chaîne sans copie

La fonction a besoin en interne d'un String, donc je voudrais aussi éviter une réallocation inutile si l'appelant appelle la fonction avec String.

foo("borrowed"); 
foo(format!("owned")); 

Pour accepter les références que je sais que je peux utiliser foo<S: AsRef<str>>(s: S), mais qu'en est-dans l'autre sens?

Je pense que l'argument générique basé sur ToOwned pourrait fonctionner (fonctionne pour &str, et je suppose qu'il est un non-op sur String), mais je ne peux pas comprendre la syntaxe exacte.

Répondre

10

Je pense que ce que vous recherchez peut être réalisé avec le Into trait, comme ceci:

fn foo<S: Into<String>>(s: S) -> String { 
    return s.into(); 
} 

fn main() { 
    foo("borrowed"); 
    foo(format!("owned")); 
}