Avatar ·

为什么在 Rust 中不推荐将 &String、&Vec 和 &Box 作为函数参数?

大家好!我最近开始学习 Rust,注意到一件奇怪的事情:在许多教程和 Stack Overflow 上,人们说不要编写接受 `&String`、`&Vec` 或 `&Box` 的函数。相反,建议使用 `&str`、`&[T]` 和简单的 `&T`(对于 Box 用 `&T`)。但我不太明白问题出在哪里。 下面是我写的一个处理文本的简单例子: ```rust fn print_length(s: &String) { println!("字符串长度:{}", s.len()); } fn main() { let my_string = String::from("你好,世界!"); print_length(&my_string); } ``` 这段代码能运行。为什么它被认为是不好的风格?`&String` 比 `&str` 差在哪里?对于向量也是同样的问题:`&Vec` 比 `&[i32]` 差在哪里?毕竟在两种情况下我传递的都是引用,而不是所有权。 让我困惑的是,如果我写一个接受 `&str` 的函数,那么在调用时如果传入 `String`,我每次都必须显式地进行类型转换:`print_length(&my_string[..])` 或 `print_length(my_string.as_str())`。而用 `&String` 则一切正常。