下面两行在[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);
}
thread::spawn
将某个不带参数的函数作为参数并返回稍后可检索的结果。foo
这才是正儿八经的功能,而且move || foo()
——。这个闭包的作用与函数完全相同foo
:它不接受任何参数(|\* пусто *\|
)并调用函数foo
并返回其结果。move
顺便说一下,这里不需要,很简单|| foo()
和
和
甚至
都是同样的事情。
JoinHandle<T>
不包含任何有用的显示信息。该值与已在运行但可能尚未完成的线程相关。例如,您可以使用它
join
,如果线程工作已经完成,则获取其结果,如果没有完成,则等待它完成。此结果被包装在中
Result
,以防执行期间发生恐慌。如果线程成功结束,则会有Ok(результат)
。在这种情况下,它是在此线程内执行的函数foo
(或move || foo()
,再次,是同一件事)的结果,即很有可能会有Ok(88)
。关于问题的第二部分。
g2
,以及v1
——粗略地说,这是功能本身,而不是其工作的结果。它本身并没有什么有用的东西可以显示。