2015-05-23 12 views
6

Quando una stringa viene archiviata come String anziché &str, non riesce ad implementare il tratto ToSocketAddrs. Il più vicino possibile è impl<'a> ToSocketAddrs for (&'a str, u16).Coercing String to & str

let url = "www.google.com".to_string(); //String 
let url2 = "www.google.com"    //&'static str 
let port = 80; 

// Does not work 
let tcp = TcpStream::connect((url, port)); 

// Works 
let tcp2 = TcpStream::connect((url2, port)); 

Come posso costringere un String in un &str ai fini della realizzazione del tratto ToSocketAddrs? Dalla documentazione per ruggine 1.0 ho pensato che String si sarebbe spostato automaticamente su &str.

risposta

8

La risposta di hauleth funzionerà per voi, ma non è tutta la storia. In particolare, il tuo String non esegue la coercizione a &str perché la deref forzata automatica non entra in gioco quando la corrispondenza dei tratti, come da RFC 0401. Pertanto, l'utilizzo di una semplice &url non funzionerà in questo caso perché a essa non verrà applicato l'auto deref. Invece di ottenere uno &str, avrai solo uno &String, che non ha un impl corrispondente per ToSocketAddrs. Tuttavia, è possibile causare esplicitamente il deref con l'operatore di dereferenziazione. In particolare, dovrebbe funzionare &*url. (&url[..] funziona anche perché [..] è la sintassi per "prendere una fetta su tutto", ma è un po 'più prolisso.)

+0

Grazie al link alla RFC. Mi stavo strappando i capelli chiedendomi perché le funzioni avrebbero forzato e questo non sarebbe –

+1

@PaulThompson Se sei soddisfatto di una delle risposte che hai ricevuto, allora dovresti accettarne una. – BurntSushi5

+0

@PaulThompson Grazie. :-) – BurntSushi5

4

Come std::net::ToSocketAddrs è implementato solo su (&str, _) è necessario prendere fetta di stringa &url[..] fetta sintassi:

let tcp = TcpStream::connect((&url[..], port)); 

Vecchio risposta sbagliata

Per costringere è necessario prendere riferimento alla String come implementa AsRef<str>:

let tcp = TcpStream::connect((&url, port)); 

http://is.gd/NNiNe7

+0

Questo non sembra funzionare per questo abbastanza strano http://is.gd/00Df6H –

+0

Questo è causato dal fatto che 'ToSocketAddrs' non è implementato né per' (String, _) 'e' (& String, _) '. Devi prendere ref di '& url [..]'. – Hauleth

+0

Capito. Saluti :) –