[英]How can I coerce a String into a &str for the purposes of implementing the ToSocketAddrs trait?
當字符串存儲為String
而不是&str
它無法實現特征ToSocketAddrs
。 最接近的可能是impl<'a> ToSocketAddrs for (&'a str, u16)
。
use std::net::TcpStream;
fn main() {
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));
}
這失敗了:
error[E0277]: the trait bound `(std::string::String, {integer}): std::net::ToSocketAddrs` is not satisfied
--> src/main.rs:9:11
|
9 | let tcp = TcpStream::connect((url, port));
| ^^^^^^^^^^^^^^^^^^ the trait `std::net::ToSocketAddrs` is not implemented for `(std::string::String, {integer})`
|
= help: the following implementations were found:
<(std::net::Ipv6Addr, u16) as std::net::ToSocketAddrs>
<(std::net::Ipv4Addr, u16) as std::net::ToSocketAddrs>
<(&'a str, u16) as std::net::ToSocketAddrs>
<(std::net::IpAddr, u16) as std::net::ToSocketAddrs>
= note: required by `std::net::TcpStream::connect`
為了實現ToSocketAddrs
特性,我怎樣才能將String
強制轉換為&str
? 從Rust 1.0的文檔中,我認為String
會自動移動到&str
。
hauleth的回答對你有用,但並不是全部。 特別是,你的String
不會強制轉換為&str
,因為根據RFC 0401 ,當特征匹配時,auto deref強制不會啟動。 因此,在這種情況下使用plain &url
將不起作用,因為不會對其應用auto deref。 你不會得到一個&str
,而只是得到一個&String
,它沒有ToSocketAddrs
的匹配impl。 但是,您可以使用取消引用運算符顯式地導致deref。 特別是, &*url
應該可以工作。 ( &url[..]
也有效,因為[..]
是“對所有內容進行切片”的語法,但它有點冗長。)
由於std::net::ToSocketAddrs
僅在(&str, _)
上實現(&str, _)
您需要使用&url[..]
切片語法來獲取字符串的一部分:
let tcp = TcpStream::connect((&url[..], port));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.