我想编写一个函数,该函数接受“ 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);
这可能吗?
答案 0 :(得分:7)
您可以使用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
。