Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么对可变变量调用方法会导致其值移动?_Rust_Borrowing - Fatal编程技术网

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)
}