Как вывести содержимое JoinHandle?
Две строчки [A]
и [B]
, приведенные ниже, дают одинаковый результат в работе
кода приложения, т.е. взаимозаменяемы и приложение отрабатывает корректно.
Я правильно понимаю:
первая - передаёт в переменную сигнатуру, т.е. саму функцию foo
вторая - передаёт в переменную результат работы функции foo
- Как вывести содержимое 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);
}
h1 = JoinHandle { .. }
h2 = JoinHandle { .. }
- Как тогда сделать подобное в примере ниже, чтобы отрабатывало
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 шт):
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
- это, грубо говоря, сама функция, а не результат ее работы. В ней самой по себе тоже нет ничего полезного для отображения.