[英]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.