为了实现ToSocketAddrs特性,我怎样才能将String强制转换为&str?

Pau*_*son 6 string rust

当字符串存储为a String而不是a时,&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));
}
Run Code Online (Sandbox Code Playgroud)

这失败了:

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`
Run Code Online (Sandbox Code Playgroud)

为了实现这个特性,我怎样才能强制String进入a ?从Rust 1.0的文档中,我认为会自动转移到.&strToSocketAddrsString&str

Bur*_*hi5 8

hauleth的回答对你有用,但并不是全部.特别是,你String没有强迫a &str,因为根据RFC 0401,当特征匹配时,自动deref强制不起作用.因此,&url在这种情况下使用plain 不起作用,因为不会对其应用auto deref.而不是得到一个&str,你只会得到一个&String,没有匹配的impl ToSocketAddrs.但是,您可以使用取消引用运算符显式地导致deref.特别是&*url应该工作.(&url[..]也可以,因为它[..]是"对所有内容进行切片"的语法,但它有点冗长.)


Hau*_*eth 5

仅当您需要使用切片语法获取字符串的切片时才std::net::ToSocketAddrs实现:(&str, _)&url[..]

let tcp = TcpStream::connect((&url[..], port));
Run Code Online (Sandbox Code Playgroud)