Fix Return Local Reference
TODO: collapasable, copyable, download, etc
For this Rust function
`pub async fn get_auction_lot() -> &'static AuctionLotStrapiResponseWrapper { let client = Client::builder().finish(); // We get back a list of Lots with 1 or 0 results let mut resp = client .get("http://localhost:1337/api/auction-lots?filters[lot_number][$eq]=151&populate=*") .bearer_auth(TOKEN) .send() .await .unwrap();
let serde_result: Result<AuctionLotsStrapiResponse, JsonPayloadError> =
resp.json::<AuctionLotsStrapiResponse>().await;
let result = serde_result.unwrap();
if result.data.len() >= 1 {
return result.data.get(0).unwrap();
} else {
panic!("This lot number does not exist");
}
}`
How can I fix this error
Compiling estate-auction v0.1.0 (/home/ozten/projects/estate-auction) error[E0515]: cannot return value referencing local data
result.data --> src/model/strapi_client.rs:53:16 | 53 | return result.data.get(0).unwrap(); | ------------------^^^^^^^^^ | | | returns a value referencing data owned by the current function |
result.data` is borrowed here
For more information about this error, try rustc --explain E0515
.
error: could not compile estate-auction
(lib) due to previous error
[Finished running. Exit status: 101]
The error message indicates that you're trying to return a reference to a local variable (
result.data). In Rust, local variables are dropped when the function they're in returns. Thus, the reference to
result.datawould be invalid outside of the
get_auction_lot()` function, and the Rust compiler prevents this from happening to avoid dangling references and undefined behavior.
To fix this error, instead of returning a reference, you should return the value itself. This will require changing the function's return type to AuctionLotStrapiResponseWrapper
and possibly also the types of some of the other variables in your function.
Assuming that AuctionLotStrapiResponseWrapper
is the type of the values contained in result.data
, your function might look like this:
pub async fn get_auction_lot() -> AuctionLotStrapiResponseWrapper {
let client = Client::builder().finish();
// We get back a list of Lots with 1 or 0 results
let mut resp = client
.get("http://localhost:1337/api/auction-lots?filters[lot_number][$eq]=151&populate=*")
.bearer_auth(TOKEN)
.send()
.await
.unwrap();
let serde_result: Result<AuctionLotsStrapiResponse, JsonPayloadError> =
resp.json::<AuctionLotsStrapiResponse>().await;
let result = serde_result.unwrap();
if result.data.len() >= 1 {
return result.data.get(0).unwrap().clone(); // Here we clone the value to return it
} else {
panic!("This lot number does not exist");
}
}
Please note that the clone()
function is used to make a copy of the value. This is only possible if AuctionLotStrapiResponseWrapper
implements the Clone
trait. If this isn't the case, you would need to modify the structure to implement it or find another way to return a valid value without borrowing from result.data
.
Related Chats
Fix HttpResponse Type Mismatch 0.599
Use Promise.allSettled refactor code 0.474
Rust Enum for Strings 0.434
Tests Funktion sortByMessageId 0.388
Rust Marketplace Scraper. 0.386
Memory Issue during Compilation 0.382
Serde Rename JSON Field 0.380