我一直在try 使用以下函数来初始化值(这里是hashBrown的hashmap):

use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::thread;

#[derive(Clone)]
struct Entity;

fn create_value(center: (f32, f32), length: f32) -> HashMap<(i32, i32), Option<Entity>> {
    let cities: Arc<Mutex<HashMap<(i32, i32), Option<Entity>>>> = Arc::default();
    let mut handles = vec![];

    for i in 0..5 {
        for j in 0..5 {
            let city_thread = Arc::clone(&cities);
            handles.push(thread::spawn(move || {
                // do stuff in parallel
                if let Ok(mut cities) = city_thread.lock() {
                    cities.insert((i, j), None);
                } 
            }));
        }
    }

    for handle in handles {
        handle.join().unwrap();
    }

    // this part is the problem
    if let Ok(city) = cities.lock() {
        let city = city.clone();
        return city;
    } else {
        panic!()
    }
}

我得到以下错误:

`cities` does not live long enough
the temporary is part of an expression at the end of a block;
consider forcing this temporary to be dropped sooner, before the block's local variables are dropped

我知道我做错了什么,但我找不到任何东西或方法来返回值.

推荐答案

我们需要将city.clone()的结果放入一个变量中,该变量被声明为最后的if let块中的before,并将return也移出if let块.

use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::thread;

#[derive(Clone)]
struct Entity;

fn create_value(center: (f32, f32), length: f32) -> HashMap<(i32, i32), Option<Entity>> {
    let cities: Arc<Mutex<HashMap<(i32, i32), Option<Entity>>>> = Arc::default();
    let mut handles = vec![];

    for i in 0..5 {
        for j in 0..5 {
            let city_thread = Arc::clone(&cities);
            handles.push(thread::spawn(move || {
                // do stuff in parallel
                if let Ok(mut cities) = city_thread.lock() {
                    cities.insert((i, j), None);
                }
            }));
        }
    }

    for handle in handles {
        handle.join().unwrap();
    }

    let result;
    if let Ok(city) = cities.lock() {
        result = city.clone();
    } else {
        panic!()
    }

    result
}

或者,我们可以通过在if let后面添加一个分号来避免if let成为"块末尾的表达式".这很奇怪,但它有效!

use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::thread;

#[derive(Clone)]
struct Entity;

fn create_value(center: (f32, f32), length: f32) -> HashMap<(i32, i32), Option<Entity>> {
    let cities: Arc<Mutex<HashMap<(i32, i32), Option<Entity>>>> = Arc::default();
    let mut handles = vec![];

    for i in 0..5 {
        for j in 0..5 {
            let city_thread = Arc::clone(&cities);
            handles.push(thread::spawn(move || {
                // do stuff in parallel
                if let Ok(mut cities) = city_thread.lock() {
                    cities.insert((i, j), None);
                } 
            }));
        }
    }

    for handle in handles {
        handle.join().unwrap();
    }

    // this part is the problem
    if let Ok(city) = cities.lock() {
        let city = city.clone();
        return city;
    } else {
        panic!()
    }
    
    ;
}

(不过,我会推荐第一种方法.)

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

如何访问Rust存储值的内存地址

如何go 除铁 rust 中路径组件的第一项和最后一项?

在UdpSocket上使用sendto时的隐式套接字绑定

支持TLS的模拟HTTP服务器

从Type::new()调用函数

闭包不会发送,即使它只捕获发送变量

如何将映射反序列化为具有与键匹配的字段的定制 struct 的向量?

为什么`AlternateScreen`在读取输入键时需要按Enter键?

使用 select 处理 SIGINT 和子等待!无阻塞

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

为什么 js_sys Promise::new 需要 FnMut?

我可以用 Rust 编写一个不可变变量

缺失serde的字段无法设置为默认值

我什么时候应该使用特征作为 Rust 的类型?

Rust 中的方法调用有什么区别?

rust 中不同类型的工厂函数

在每个循环迭代中删除borrow

如何解析 Rust 中的 yaml 条件字段?

深度嵌套枚举的清洁匹配臂