Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I coerce a String into a &str for the purposes of implementing the ToSocketAddrs trait?

Tags:

string

rust

When a string is stored as a String rather than a &str it fails to implement the trait ToSocketAddrs. The closest possible one that does is 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));
}

This fails with:

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`

How can I coerce a String into a &str for the purposes of implementing the ToSocketAddrs trait? From the documentation for Rust 1.0, I thought that String would automatically move to &str.

like image 689
Paul Thompson Avatar asked May 23 '15 11:05

Paul Thompson


People also ask

How do you turn a string into a value?

Converting Values to Strings Values can be explicitly converted to strings by calling either String() or n. toString() . With the String() function, let's convert a Boolean value to a string by passing the value true into the parameters for String() .

How do you change a string to an int C++?

One effective way to convert a string object into a numeral int is to use the stoi() function. This method is commonly used for newer versions of C++, with is being introduced with C++11. It takes as input a string value and returns as output the integer version of it.

How do I convert a string to a number in node?

You can convert a string to a number in Node. js using any of these three methods: Number() , parseInt() , or parseFloat() .

How do you convert a string to a value in Python?

To convert, or cast, a string to an integer in Python, you use the int() built-in function. The function takes in as a parameter the initial string you want to convert, and returns the integer equivalent of the value you passed.


2 Answers

hauleth's answer will work for you, but it's not quite the whole story. In particular, your String isn't coercing to a &str because auto deref coercion does not kick in when trait matching, as per RFC 0401. Therefore, using a plain &url won't work in this case because auto deref won't be applied to it. Instead of getting an &str, you'll just get a &String, which doesn't have a matching impl for ToSocketAddrs. However, you can explicitly cause deref to happen with the dereference operator. In particular, &*url should work. (&url[..] also works because [..] is the syntax for "take a slice over everything", but it's a bit more verbose.)

like image 84
BurntSushi5 Avatar answered Oct 11 '22 04:10

BurntSushi5


As std::net::ToSocketAddrs is implemented only on (&str, _) you need to take a slice of of the string using the &url[..] slice syntax:

let tcp = TcpStream::connect((&url[..], port));
like image 39
Hauleth Avatar answered Oct 11 '22 03:10

Hauleth