Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to accept &str, String and &String in a single function?

I want to write a single function, that accepts a &str, a String and a borrowed &String. I've written the following 2 functions:

fn accept_str_and_ref_string(value: &str) {
    println!("value: {}", value);
}

fn accept_str_and_string<S: Into<String>>(value: S) {
    let string_value: String = value.into();
    println!("string_value: {}", string_value);
}

fn main() {
    let str_foo = "foo";
    let string_foo = String::from("foo");

    accept_str_and_ref_string(str_foo);
    accept_str_and_ref_string(&string_foo);

    accept_str_and_string(str_foo);
    accept_str_and_string(string_foo);
}

Is it possible to implement one function so that I can do this:

accept_all_strings(str_foo);
accept_all_strings(&string_foo);
accept_all_strings(string_foo);
like image 499
Ringo Leese Avatar asked Mar 09 '19 15:03

Ringo Leese


People also ask

Why is accepting things so hard?

Some people have a hard time accepting situations because they feel as though acceptance is the same thing as being in agreement with what happened or saying that it is OK. In other cases, people don't want to acknowledge the pain that would come with acceptance.


1 Answers

You can use the AsRef<str> trait:

// will accept any object that implements AsRef<str> fn print<S: AsRef<str>>(stringlike: S) {     // call as_ref() to get a &str     let str_ref = stringlike.as_ref();      println!("got: {:?}", str_ref) }  fn main() {     let a: &str = "str";     let b: String = String::from("String");     let c: &String = &b;      print(a);     print(c);     print(b); } 

The print function will support any type that implements AsRef<str>, which includes &str, String and &String.

like image 154
Frxstrem Avatar answered Sep 23 '22 16:09

Frxstrem