我如何错误地处理生命周期?

问题描述 投票:0回答:0

我是 Rust 的新手,想创建一个简单的应用程序来学习股票分析。一切都很顺利,直到我尝试将缓存合并到应用程序中。我尝试了许多不同的状态管理方法,但发现人们建议将状态从父级传递给子级,所以这就是我的尝试。所以现在,许多函数需要对主函数中声明的 Cache 结构的可变引用。

起初我只是调整函数签名,直到编译器停止抱怨;然而,一个函数包含一个循环,并且在循环内部缓存被传递给一个方法。这导致了在迭代中发生多次可变借用的问题。

async fn symbols_to_stocks<'a>(symbols: Vec<AvailableTraded>, cache: &'static mut Cache) -> Vec<&'a mut Stock>
where
    'static: 'a
{
    let mut stocks = vec![];

    for stock in symbols {
        if stock.type_ == "stock" && (stock.exchange_short_name == "NYSE"
            || stock.exchange_short_name == "NASDAQ")
        {
            stocks.push(Stock::new(stock.symbol, cache).await);
        }
    }

    stocks
}

如你所见,我也尝试使用一些生命周期规范。我想说的是:借用缓存的功能将在每次迭代后死亡,因此借用不会重叠。我不知道这是否是正确的推理,或者是否可以实施。这是我在循环中调用的新方法:

pub async fn new<'a>(ticker: String, cache: &'a mut Cache) -> &'a mut Self {

    let index = cache.stock_index_in_cache(ticker.clone());

    if index >= 0 {
        return &mut cache.stocks[index as usize];
    }

    let stock_to_be = Self {
        ticker,
        statements: Statements::new(),
        metrics: Metrics::new(),
    };

    return cache.add_stock(stock_to_be).await;
}

我已经在 SO 上尝试了多个建议来避免 multiple mut borrow 问题,但我要么无法实施它们,要么它们不起作用。这里真正的问题是什么?

rust lifetime borrow-checker
© www.soinside.com 2019 - 2024. All rights reserved.