如何从函数中返回 JoinHandle?

8
什么是处理这种情况的最佳方法:
use std::thread;

struct Prefe;

fn main() {
    let prefe = Prefe;

    start(&prefe).join();
}

fn start(pre: &Prefe) -> thread::JoinHandle {
    thread::spawn(move || {
        println!("Test spawn");
    })
}

I get the error:

error[E0243]: wrong number of type arguments: expected 1, found 0
  --> src/main.rs:11:26
   |
11 | fn start(pre: &Prefe) -> thread::JoinHandle {
   |                          ^^^^^^^^^^^^^^^^^^ expected 1 type argument

我认为我可以使用类似这样的东西,但是我不知道用什么来代替T

fn start<T>(pre: &Prefe, t: T) -> thread::JoinHandle<T> {
    thread::spawn(move || {
        println!("Test spawn");
    })
}

我看到thread::spawn使用这个来返回,但是我不知道这是否能帮助我或如何使用它:

Builder::new().spawn(f).unwrap()

这个方法似乎可以工作,但我不知道它是否正确或错误:

fn start(pre: &Prefe) -> thread::JoinHandle<()> {
    thread::spawn(move || {
        println!("Test spawn");
    })
}
1个回答

13

请查看thread::spawn的函数签名:

pub fn spawn<F, T>(f: F) -> JoinHandle<T>
where
    F: FnOnce() -> T,
    F: Send + 'static,
    T: Send + 'static,

这意味着spawn接受一个泛型类型F。这个类型必须实现特质FnOnce,并且这个实现不带参数并返回类型为T的参数。 spawn返回一个参数为相同类型TJoinHandle

要使用此信息,您需要知道您的闭包返回的类型。一旦您知道它,那就是您应该用来参数化您的JoinHandle的类型。

你的示例闭包调用了println!,其返回类型为(),因此JoinHandle将使用它。


谢谢您的解释,现在我认为如果返回一个 i32 就更清晰了。例如,它只需要指示它,因此 -> JoinHandle<i32> 或作为 T 的参数。感谢您的时间。 - Angel Angel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接