通用函数接受 &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"));
}