如何在一个函数中接受&str,String和&String?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在一个函数中接受&str,String和&String?相关的知识,希望对你有一定的参考价值。

我想写一个单一函数,接受一个 &str, a String 和借来的 &String. 我写了以下两个函数。

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

能不能用一个函数来实现,这样我就可以做到了。

accept_all_strings(str_foo);
accept_all_strings(&string_foo);
accept_all_strings(string_foo);
答案

你可以使用 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.

以上是关于如何在一个函数中接受&str,String和&String?的主要内容,如果未能解决你的问题,请参考以下文章

如何更改此向量函数以接受更多元素? [复制]

我应该如何使用&str,Option和String编组Rust函数并在C#中使用它?

getline()函数的使用

将`char []`传递给接受`std :: string&`的函数是不是是一种好习惯

getline()函数

java中如何实现string的第一个字母大写