String 喜欢&str而不是字符串?总是这样吗?

String 喜欢&str而不是字符串?总是这样吗?,string,rust,String,Rust,Rust的文档建议在可能的情况下使用&str,只有在不可能的情况下,才使用String。总是这样吗?例如,我正在为web服务的REST API构建客户端,我有一个实体: struct User { id: &str // or String? name: &str // or String? //...... } 因此,在一般情况下以及在这种特殊情况下使用&str或String是否更好?在Rust中,与是否使用引用相关的一切都源于所有权和借款的基本概念及其应用。当您

Rust的文档建议在可能的情况下使用&str,只有在不可能的情况下,才使用String。总是这样吗?例如,我正在为web服务的REST API构建客户端,我有一个实体:

struct User {
  id: &str // or String?
  name: &str // or String?
  //......
}

因此,在一般情况下以及在这种特殊情况下使用&str或String是否更好?

在Rust中,与是否使用引用相关的一切都源于所有权和借款的基本概念及其应用。当您设计数据结构时,没有明确的规则:它完全取决于您的确切用例

例如,如果您的数据结构打算像迭代器那样提供其他数据结构的视图,那么使用引用和切片作为字段是有意义的。另一方面,如果您的结构是DTO,则更自然的做法是使其拥有所有数据

我认为在可能的情况下使用&str的建议更适用于函数定义,在这种情况下,这是很自然的:如果您让函数接受&str而不是String,那么它们的调用者将能够轻松地使用它们,并且如果它们有String或&str,则不会产生任何成本;另一方面,如果您的函数接受字符串,那么如果它们的调用方有&str,它们将被迫分配一个新字符串,即使它们有字符串但不想放弃所有权,它们仍然需要克隆它

但当然也有例外:有时您确实希望在函数内部转移所有权。一些数据结构和特性,如Option或Reader,提供了将拥有的变体转换为借用的一个Option::as_ref和Reader::by_ref的能力,这有时很有用。还有一种类型是对所有权进行抽象,允许您传递一个借来的值,必要时将对其进行克隆。有时有一种特性,比如对各种类型进行抽象、拥有和借用,并允许调用方传递不同类型的值

我想再次强调的是,并没有固定的规则,这完全取决于你们正在从事的具体任务。在构建数据结构时,应该使用常识和所有权/借用概念


在您的特定情况下,是使用String还是&str取决于您对用户对象的实际操作——遗憾的是,RESTAPI客户端太模糊了。这取决于您的体系结构。如果这些对象仅用于执行HTTP请求,但数据实际上存储在其他源中,那么您可能需要使用&strs。另一方面,如果在整个程序中使用用户对象,那么让用户对象使用字符串来拥有数据是有意义的。

我建议您阅读。@WindorC,我建议您阅读我的帖子。@AlexanderSupertramp:您的帖子没有足够的信息供我们提供建议。文件中的建议是合理的:只要可能;当然,这意味着开发者需要了解什么是可能的,以及它依赖于什么。在这种情况下,它取决于所有权,对于&str所指内容的所有权没有任何精确性,对于您的具体情况,根本无法回答这个问题,只能给出一般性的建议。@MatthieuM,你为什么不把它作为答案发布出来?@AlexanderSupertramp:因为我正在等待一个问题更新,精确说明在这种情况下,用户是如何使用字符串还是a&str是最好的。