【发布时间】:2019-05-17 03:39:34
【问题描述】:
Rust 具有所有权和借贷的概念。如果函数不借用其参数作为引用,则该函数的参数将被移动,并且一旦超出范围就会被释放。
取这个函数:
fn build_user(email: String, username: String) -> User {
User {
email: email,
username: username,
}
}
这个函数可以这样调用:
let email = String::from("foo@example.com");
let username = String::from("username");
let user = build_user(email, username);
由于email 和username 已被移动,因此在调用build_user 后它们将无法再使用。
这可以通过让 API 使用借用的引用来解决。
考虑到这一点,在设计 API 时,哪些场景总是倾向于不使用借用?
【问题讨论】:
-
函数
build_user()将参数移动到结构User中。如果您想使用借用编写相同的函数,则不能将它们移动到结构中,因为您不拥有它们,因此您必须克隆它们(或更改User的定义以存储借用) . -
我认为这个问题对于 StackOverflow QA 格式来说有点太宽泛太模糊了。
-
感谢 cmets!不幸的是,他们似乎没有解决我的问题。如果它太宽泛,我很乐意让它更具体。有什么建议?我只是想知道为什么或何时想要创建一个不借用的 API。必须有案例。
-
我的评论并不是作为一个答案,而是要指出你声称你也可以使用借用的说法是不正确的。作为推论,这个函数是一个通常按值获取参数的函数的示例,因为它需要所有权。如果您想要更多示例,只需查看标准库即可。按值接受参数的函数通常不能写成借用。
-
之所以我认为这个过于笼统,是因为回答这个问题基本上是为了解释 Rust 的所有权制度。对此已有很好的介绍,例如 Rust 书中关于所有权的章节。
标签: reference rust move-semantics api-design borrowing