通用函数接受 &str 或移动字符串而不复制
Generic function accepting &str or moving String without copying
为了方便调用者,我想编写一个接受任何类型字符串 (&str
/String
) 的通用函数。
该函数内部需要一个 String
,所以如果调用者使用 String
调用该函数,我也想避免不必要的重新分配。
foo("borrowed");
foo(format!("owned"));
对于接受引用,我知道我可以使用 foo<S: AsRef<str>>(s: S)
,但是其他方式呢?
我认为基于 ToOwned
的通用参数可能有效(适用于 &str
,我假设它对 String
无效),但我不能弄清楚确切的语法。
我想你想要的可以用 Into
trait 实现,像这样:
fn foo<S: Into<String>>(s: S) -> String {
return s.into();
}
fn main () {
foo("borrowed");
foo(format!("owned"));
}
为了方便调用者,我想编写一个接受任何类型字符串 (&str
/String
) 的通用函数。
该函数内部需要一个 String
,所以如果调用者使用 String
调用该函数,我也想避免不必要的重新分配。
foo("borrowed");
foo(format!("owned"));
对于接受引用,我知道我可以使用 foo<S: AsRef<str>>(s: S)
,但是其他方式呢?
我认为基于 ToOwned
的通用参数可能有效(适用于 &str
,我假设它对 String
无效),但我不能弄清楚确切的语法。
我想你想要的可以用 Into
trait 实现,像这样:
fn foo<S: Into<String>>(s: S) -> String {
return s.into();
}
fn main () {
foo("borrowed");
foo(format!("owned"));
}