2017-08-06 12 views
8

Chcę napisać ogólną funkcję, która akceptuje dowolny ciąg (&str/String) dla wygody osoby dzwoniącej.Ogólna funkcja akceptująca & str lub przenoszenie Ciąg bez kopiowania

Funkcja wewnętrznie potrzebuje String, więc chciałbym również uniknąć niepotrzebnego ponownego przydzielania, jeśli wywołujący wywołuje funkcję z String.

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

za przyjmowanie odwołań wiem, że mogę używać foo<S: AsRef<str>>(s: S), ale co w inny sposób?

myślę generic argument oparty na ToOwned może działać (działa na &str i jestem przy założeniu, że jest to nie-op na String), ale nie mogę dowiedzieć się dokładnie składni.

Odpowiedz

10

myślę czego po można osiągnąć przy Into trait, tak:

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

fn main() { 
    foo("borrowed"); 
    foo(format!("owned")); 
} 
Powiązane problemy