gpt4 book ai didi

rust - 在 Rust 中实现 Fn(&something) 的特征

转载 作者:行者123 更新时间:2023-11-29 08:07:46 25 4
gpt4 key购买 nike

<分区>

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

trait Runnable {
fn run(&self);
}

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

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

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

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

// from closure (WORKS)
run_the_runnable(&|| {
println!("Hello from run() closure");
});
}

( Rust playground )

现在,让我们更改可运行的 run() 方法以接受引用参数 (&i32),并实现 Fn(&i32):

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);
}

( Rust playground )

传递闭包不再有效:

error[E0271]: type mismatch resolving `for<'r> <[closure@<anon>:30:27: 32:10] as std::ops::FnOnce<(&'r i32,)>>::Output == ()`
--> <anon>:30:26
|
30 | run_the_runnable(&|x| {
| __________________________^ starting here...
31 | | println!("Hello from run(&i32) closure {}", x);
32 | | }, &x);
| |_________^ ...ending here: expected bound lifetime parameter , found concrete lifetime
|
= note: concrete lifetime that was found is lifetime '_#63r
= note: required because of the requirements on the impl of `Runnable` for `[closure@<anon>:30:27: 32:10]`
= note: required for the cast to the object type `Runnable`

error[E0281]: type mismatch: the type `[closure@<anon>:30:27: 32:10]` implements the trait `std::ops::Fn<(_,)>`, but the trait `for<'r> std::ops::Fn<(&'r i32,)>` is required (expected concrete lifetime, found bound lifetime parameter )
--> <anon>:30:26
|
30 | run_the_runnable(&|x| {
| __________________________^ starting here...
31 | | println!("Hello from run(&i32) closure {}", x);
32 | | }, &x);
| |_________^ ...ending here
|
= note: required because of the requirements on the impl of `Runnable` for `[closure@<anon>:30:27: 32:10]`
= note: required for the cast to the object type `Runnable`

这个错误有很多问题:

但我仍然无法解决这个特定的生命周期问题。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com