繁体   English   中英

为了实现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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM