通用函数接受& str或移动String而不复制

时间:2017-08-06 19:30:21

标签: generics rust ownership-semantics

我想编写一个接受任何类型字符串(&str / String)的泛型函数,以方便调用者。

该函数内部需要String,因此如果调用者使用String调用该函数,我也希望避免不必要的重新分配。

foo("borrowed");
foo(format!("owned"));

接受引用我知道我可以使用foo<S: AsRef<str>>(s: S),但另一种方式呢?

我认为基于ToOwned的通用参数可能有用(适用于&str,而且我假设它是String上的无操作),但我无法弄清楚确切的语法。

1 个答案:

答案 0 :(得分:10)

我认为您所追求的目标可以通过Into trait实现,如下所示:

fn foo<S: Into<String>>(s: S) -> String {
    return s.into();
}

fn main () {
    foo("borrowed");
    foo(format!("owned"));
}