Как принять Str, String и & String в одной функции ржавчины - PullRequest
5 голосов
/ 09 марта 2019

Я хочу написать одну функцию, которая принимает "str", "String" и заимствованные "& String".
Я написал следующие 2 функции:

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);
}

но я хочу это в 1 функции, чтобы я мог сделать это:

accept_all_strings(str_foo);
accept_all_strings(&string_foo);
accept_all_strings(string_foo);

Возможно ли это?

1 Ответ

7 голосов
/ 09 марта 2019

Вы можете использовать черту AsRef<str>:

// 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);
}

Функция print будет поддерживать любой тип, который реализует AsRef<str>, включая &str, String и &String.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...