为了实现 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" 的语法,但有点冗长。)