Не может заимствовать `*request` как изменяемый, потому что он также заимствован как неизменяемый

Я написал конечную точку в Rust, используя nickel.rs:

{
    let client = client.clone();
    let mongodb = MongoRepository::new(client, "rust-users".into());
    router.put("/users/:id",middleware!(|request, mut response| {

        let id = try_with!(response, { 
            request.param("id")
                   .ok_or((StatusCode::BadRequest, "Id parameter required")) 
        });
        let user = try_with!(response, {
            request.json_as::<User>()
                   .map_err(|e| 
                       (StatusCode::BadRequest, format!("{}",e))
                   )
        });
        let update_id = try_with!(response, {
            mongodb.update_by_id("users", id, user)
                   .map_err(|e| 
                       (StatusCode::InternalServerError, e) 
                   )
        });
        ApiResult::Ok(StatusCode::Ok, update_id.to_json())

    }));
}

В этой строке:

let id = try_with!(response, { 
    request.param("id")
           .ok_or((StatusCode::BadRequest, "Id parameter required")) 
});

request заимствовано в неизменном состоянии, но в этой строке:

let user = try_with!(response, {
    request.json_as::<User>()
           .map_err(|e| 
               (StatusCode::BadRequest, format!("{}",e))
           )
});

запрос заимствован в изменчивом состоянии. Это вызывает следующую ошибку:

error: cannot borrow `*request` as mutable because it is also borrowed
as immutable

Я попытался исправить эту ошибку, обернув id линии в отдельной области, но проблема сохраняется.

Я не уверен, как еще решить проблему. Что-то еще не так с кодом?

1 ответ

Решение

id имеет тип &str, Это указатель на переменную request, призвание json_as принимает в качестве параметра изменчивую ссылку на переменную request, Это приводит к ошибке "не может заимствовать *request как изменчивый, потому что он также заимствован как неизменный ".

Есть несколько способов решить эту проблему; вероятно, самым простым является использование to_owned() преобразовать &str в String,

Другие вопросы по тегам