【发布时间】:2021-06-18 13:54:09
【问题描述】:
我使用http::Request::builder() 创建请求并使用uri() 设置请求uri。
以下代码编译没有问题:
fn get_oauth_token() {
let mut request = Request::builder().uri(&*OAUTH_URL);
let uri = match request.uri_ref() {
Some(uri) => uri.to_string(),
None => String::from(""),
};
println!("{}", uri)
}
但是,如果我首先声明变量 request 并对该变量调用 uri() 方法,则会收到如下所示的错误:
fn get_oauth_token() {
let mut request = Request::builder();
request.uri(&*OAUTH_URL);
let uri = match request.uri_ref() {
Some(uri) => uri.to_string(),
None => String::from(""),
};
println!("{}", uri)
}
error[E0382]: borrow of moved value: `request`
--> src\main.rs:9:21
|
7 | let mut request = Request::builder();
| ----------- move occurs because `request` has type `http::request::Builder`, which does not implement the `Copy` trait
8 | request.uri(&*OAUTH_URL);
| ------- value moved here
9 | let uri = match request.uri_ref() {
| ^^^^^^^ value borrowed here after move
请注意,这两个 sn-ps 之间的唯一区别是我将 let mut request = Request::builder().uri(&*OAUTH_URL); 行拆分为 let mut request = Request::builder(); 和 request.uri(&*OAUTH_URL);。
变量OAUTH_URL 是这样声明的(我正在使用 dotenv 从 .env 文件中加载它):
lazy_static! {
static ref OAUTH_URL: String = env::var("OAUTH_URL").unwrap();
}
现在我查看了错误E0382 的解释,它告诉我如果将变量的值分配给另一个有意义的变量,它的值将被移动。但是,我不明白为什么会在这种情况下发生这种情况,因为我只声明了一个变量,然后在该变量上调用了一个方法。
为什么当我调用request.uri(&*OAUTH_URL); 时request 的值会被移动?
【问题讨论】:
-
@TedKleinBergman 如果单击“转到最新版本”按钮,您会看到在 0.2.3 版本中,
uri()方法确实消耗了self。这应该可以解开谜团。 -
这在 Rust 中称为builder pattern,这是一个消费构建器的示例。如果您需要拆分表达式,只需分配给一个新变量,例如
let request = Request::builder(); let request = request.uri(...); ...