Rust 为什么对可变变量调用方法会导致其值移动?
我正在使用Rust 为什么对可变变量调用方法会导致其值移动?,rust,borrowing,Rust,Borrowing,我正在使用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 =>
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)
}
请注意,这两个代码段之间的唯一区别是我拆分了行let mut request=request::builder().uri(&*OAUTH\u URL)代码>进入让mut request=request::builder()
和request.uri(&*OAUTH\uURL)代码>
变量OAUTH\uURL
声明如下(我使用dotenv从.env文件加载它):
现在我已经看了错误的解释,它告诉我,如果将一个变量的值赋给另一个有意义的变量,该变量的值将被移动。但是,我不明白为什么会发生这种情况,因为我只声明了一个变量,然后对该变量调用了一个方法
当我调用request.uri(&*OAUTH\uURL)时,request
的值为什么会移动代码>?根据,该方法移动对象,然后将其返回。所以这两个片段非常不同
当值在链中移动并存储在请求中时,第一个代码段是正确的方式;完全可以接受!在另一个代码段中,request.uri(&*OAUTH\uURL)代码>将值移动到方法中,然后将对象丢弃,即您刚刚消费并丢弃了对象
为了使它们相等,您必须编写request=request.uri(&*OAUTH\uurl)代码>
第一段(正确):
第二个代码段(错误):
备用代码段(正确):
根据,该方法移动对象,然后将其返回。所以这两个片段非常不同
当值在链中移动并存储在请求中时,第一个代码段是正确的方式;完全可以接受!在另一个代码段中,request.uri(&*OAUTH\uURL)代码>将值移动到方法中,然后将对象丢弃,即您刚刚消费并丢弃了对象
为了使它们相等,您必须编写request=request.uri(&*OAUTH\uurl)代码>
第一段(正确):
第二个代码段(错误):
备用代码段(正确):
@TedKleinBergman如果单击“转到最新版本”按钮,您将看到在0.2.3版中,uri()
方法确实消耗了self
。这应该能解开谜团。这就是所谓的生锈,这是一个消耗型建筑商的例子。如果需要拆分表达式,只需指定一个新变量,例如let request=request::builder();let request=request.uri(…)
@TedKleinBergman如果单击“转到最新版本”按钮,您将看到在版本0.2.3中,uri()
方法确实消耗了self
。这应该能解开谜团。这就是所谓的生锈,这是一个消耗型建筑商的例子。如果需要拆分表达式,只需指定一个新变量,例如let request=request::builder();let request=request.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
lazy_static! {
static ref OAUTH_URL: String = env::var("OAUTH_URL").unwrap();
}
fn get_oauth_token() {
// Object moves from Request::builder() -> .uri(&*OAUTH_URL) -> request
let mut request = Request::builder().uri(&*OAUTH_URL);
let uri = match request.uri_ref() {
Some(uri) => uri.to_string(),
None => String::from(""),
};
println!("{}", uri)
}
fn get_oauth_token() {
// Object moves from Request::builder() -> request
let mut request = Request::builder();
// Object moves from request -> .uri(&*OAUTH_URL) -> nowhere
request.uri(&*OAUTH_URL);
let uri = match request.uri_ref() {
Some(uri) => uri.to_string(),
None => String::from(""),
};
println!("{}", uri)
}
fn get_oauth_token() {
// Object moves from Request::builder() -> request
let mut request = Request::builder();
// Object moves from request -> .uri(&*OAUTH_URL) -> request again
request = request.uri(&*OAUTH_URL);
let uri = match request.uri_ref() {
Some(uri) => uri.to_string(),
None => String::from(""),
};
println!("{}", uri)
}