Как вывести содержимое JoinHandle?

Две строчки [A] и [B], приведенные ниже, дают одинаковый результат в работе
кода приложения, т.е. взаимозаменяемы и приложение отрабатывает корректно.
Я правильно понимаю:
первая - передаёт в переменную сигнатуру, т.е. саму функцию foo
вторая - передаёт в переменную результат работы функции foo

  1. Как вывести содержимое JoinHandle и в тему ли строка из документации:
    fn from(join_handle: crate::thread::JoinHandle<T>) -> OwnedHandle {}
use std::thread;

fn foo() -> usize {
   88
}
    
fn main() {
    
   let h1: thread::JoinHandle<_> = thread::spawn(foo);             // [A]
   let h2: thread::JoinHandle<_> = thread::spawn(move || foo());   // [B]

   println!("h1 = {:?}", h1);
   println!("h2 = {:?}", h2);
}

play_1

h1 = JoinHandle { .. }
h2 = JoinHandle { .. }
  1. Как тогда сделать подобное в примере ниже, чтобы отрабатывало g2 вместо g2():
    play_2
fn foo() -> usize {
   88
}

fn f<T>(z: T) -> T {
   z
}

fn main() {
    
   let g1 = f(foo());
   println!("g1 = {:?}", g1);
    
   let g2 = f(foo);
   // println!("g2 = {:?}", g2); <- ?
   assert_eq!(g1, g2());

   // или 

   let v1 = foo;
   let v2 = foo();
   // println!("v1 = {:?}", v1);
   println!("v1 = {:?}", v1());
   println!("v2 = {:?}\n", v2);
}

Ответы (1 шт):

Автор решения: extrn

thread::spawn принимает в качестве аргумента некоторую функцию, не принимающую аргументов, и возвращающую результат, который можно будет получить позднее.

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

foo это как раз подходящая функция, но и move || foo() - тоже. Это замыкание, которое делает ровно то же самое что и функция foo: не принимает аргументов (|\* пусто *\|) и вызывает функцию foo, возвращая ее результат.

move, кстати, здесь без надобности, достаточно просто || foo()

let result = foo(); // 88

и

let f = foo;
let result = f(); // 88

и

let f = || foo();
let result = f(); // 88

и даже

let result = (|| foo())(); // 88

это приблизительно то же самое.

JoinHandle<T> не содержит информации, которая была бы полезна для отображения. Это значение связанное с уже запущенным, но, возможно, еще не завершенным тредом.

На нем, например, можно применить join, и получить результат работы треда, если он к этому времени уже завершен, а если нет - дождаться его завершения.

Этот результат завернут в Result, на случай, если в процессе выполнения произошла паника. Если тред завершился удачно, то там будет Ok(результат). В данном случае это результат функции foo (ну или move || foo(), что, опять же, то же самое), выполненной в рамках этого треда, т.е. там скорее всего будет Ok(88).

По второй части вопроса. g2, как и v1 - это, грубо говоря, сама функция, а не результат ее работы. В ней самой по себе тоже нет ничего полезного для отображения.

→ Ссылка