Почему add_cart жалуется с ошибкой? - PullRequest
0 голосов
/ 08 декабря 2018

Пытаясь понять, почему merchant.add_cart() жалуется, а merchant.add_product() в порядке.И Cart, и Product содержат более или менее одинаковую структуру

use std::collections::HashMap;

#[derive(Debug, Clone)]
struct Merchant<'a> {
    id: u64,
    name: String,
    products: HashMap<u64, &'a Product>,
    carts: HashMap<u64, &'a Cart>,
}

impl<'a> Merchant<'a> {
    pub fn new(id: u64, name: String) -> Merchant<'a> {
        Merchant {
            id,
            name,
            products: HashMap::new(),
            carts: HashMap::new(),
        }
    }

    pub fn add_product(&mut self, product: &'a Product) {
        self.products.insert(product.id, product);
    }

    pub fn add_cart(&mut self, cart: &'a Cart) {
        self.carts.insert(cart.id, cart);
    }
}

#[derive(Debug, Clone)]
struct Product {
    id: u64,
    name: String,
    amount_in_cents: u64,
}

impl Product {
    pub fn new(id: u64, name: String, amount_in_cents: u64) -> Product {
        Product {
            id,
            name,
            amount_in_cents,
        }
    }
}

#[derive(Debug, Clone)]
struct Cart {
    id: u64,
}

impl Cart {
    pub fn new(id: u64) -> Cart {
        Cart { id }
    }
}

fn main() {
    let apple = Product::new(1, String::from("Apple"), 10000);
    let orange = Product::new(2, String::from("Orange"), 20000);
    let guava = Product::new(3, String::from("Guava"), 30000);

    let mut merchant = Merchant::new(1, String::from("Oak Market"));

    merchant.add_product(&apple);
    merchant.add_product(&orange);
    merchant.add_product(&guava);

    let cart = Cart::new(1);
    merchant.add_cart(&cart);
}

merchant.add_cart(&cart); жалуется на

cart does not live long enough: borrowed value does not live long enough

Использование rustc 1.31.0

1 Ответ

0 голосов
/ 08 декабря 2018

Когда я компилирую ваш код, появляется полное сообщение об ошибке:

   |
70 |     merchant.add_cart(&cart);
   |                        ^^^^ borrowed value does not live long enough
71 | }
   | - `cart` dropped here while still borrowed
   |
   = note: values in a scope are dropped in the opposite order they are created

Эта последняя строка сообщает вам о вашей проблеме.Вы объявили apple, orange и guava до merchant, поэтому они переживают merchant, и поэтому можно хранить ссылки на них.Тем не менее, вы объявляете cart после merchant, поэтому merchant переживает его, поэтому вы не можете сохранить ссылку на него.

Обратите внимание, что ваш код будет скомпилирован в выпуске Rust 2018 из-зане лексические времена жизни, объясненные здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...