为了实现 ToSocketAddrs 特性,我如何将 String 强制转换为 &str ?
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
。
由于 std::net::ToSocketAddrs
仅在 (&str, _)
上实现,您需要使用 &url[..]
切片语法获取字符串的一部分:
let tcp = TcpStream::connect((&url[..], port));
hauleth 的回答对您有用,但并非全部。特别是,您的 String
没有强制转换为 &str
,因为根据 RFC 0401,自动取消引用强制在特征匹配时不会启动。因此,在这种情况下使用普通的 &url
是行不通的,因为自动取消引用不会应用于它。您不会得到 &str
,而是得到 &String
,它没有 ToSocketAddrs
的匹配实现。但是,您可以使用取消引用运算符显式地导致取消引用发生。特别是,&*url
应该有效。 (&url[..]
也有效,因为 [..]
是 "take a slice over everything" 的语法,但有点冗长。)
当字符串存储为 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
。
由于 std::net::ToSocketAddrs
仅在 (&str, _)
上实现,您需要使用 &url[..]
切片语法获取字符串的一部分:
let tcp = TcpStream::connect((&url[..], port));
hauleth 的回答对您有用,但并非全部。特别是,您的 String
没有强制转换为 &str
,因为根据 RFC 0401,自动取消引用强制在特征匹配时不会启动。因此,在这种情况下使用普通的 &url
是行不通的,因为自动取消引用不会应用于它。您不会得到 &str
,而是得到 &String
,它没有 ToSocketAddrs
的匹配实现。但是,您可以使用取消引用运算符显式地导致取消引用发生。特别是,&*url
应该有效。 (&url[..]
也有效,因为 [..]
是 "take a slice over everything" 的语法,但有点冗长。)