簡體   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