Rust 铁锈中Fn(&;某物)的实施特征

Rust 铁锈中Fn(&;某物)的实施特征,rust,traits,lifetime,Rust,Traits,Lifetime,下面是一个为Fn()实现Runnable的工作示例(这样我们就可以直接将&close传递给run\u Runnable函数): () 通过关闭不再有效: error[E0271]:根据a中的建议,为解决类型不匹配问题,在闭包参数中给出显式类型修复了问题: @@ -26,8 +26,8 @@ fn main() { // from struct instance (WORKS) run_the_runnable(&MyRunnable, &x); - /

下面是一个为
Fn()
实现
Runnable
的工作示例(这样我们就可以直接将&close传递给
run\u Runnable
函数):

()

通过关闭不再有效:

error[E0271]:根据a中的建议,为解决类型不匹配问题,在闭包参数中给出显式类型修复了问题:

@@ -26,8 +26,8 @@ fn main() {
     // from struct instance (WORKS)
     run_the_runnable(&MyRunnable, &x);

-    // from closure (DOES NOT WORK)
-    run_the_runnable(&|x| {
+    // from closure with annotated type (WORKS)
+    run_the_runnable(&|x: &i32| {
         println!("Hello from run(&i32) closure {}", x);
     }, &x);
 }

()

添加显式类型注释帮助。例如,说
&|x:&i32{…}
已经解决了这个问题。在这些情况下,Rust似乎在推断类型方面存在问题:/至少我认为问题在于此。
trait Runnable {
    fn run(&self, x: &i32);
}

impl<F> Runnable for F where F: Fn(&i32) {
    fn run(&self, x: &i32) {
        self(x);
    }
}

fn run_the_runnable(runnable: &Runnable, x: &i32) {
    runnable.run(x);
}

fn main() {
    // runnable without parameters
    struct MyRunnable;
    impl Runnable for MyRunnable {
        fn run(&self, x: &i32) {
            println!("Hello from MyRunnable {}", x);
        }
    }

    let x = 42;

    // from struct instance (WORKS)
    run_the_runnable(&MyRunnable, &x);

    // from closure (DOES NOT WORK)
    run_the_runnable(&|x| {
        println!("Hello from run(&i32) closure {}", x);
    }, &x);
}
@@ -26,8 +26,8 @@ fn main() {
     // from struct instance (WORKS)
     run_the_runnable(&MyRunnable, &x);

-    // from closure (DOES NOT WORK)
-    run_the_runnable(&|x| {
+    // from closure with annotated type (WORKS)
+    run_the_runnable(&|x: &i32| {
         println!("Hello from run(&i32) closure {}", x);
     }, &x);
 }