最近在写一点东西, 但是遇到好多生命周期的大问题. https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ef6a8541d4dbe806e6f3b7d61f519180
App的start方法入参必须是&'static mut self
, 因为下面的调用需要用到App的f属性, f是一个异步方法.
但是在执行start时却报App生命周期不够.
作为作者, 我是知道app这个变量是不会drop的因为start是一个blocking function.
但是编译器不知道, 那应该怎么告诉它呢?
试过将app放到static, 但是static不能是mut, 所以失败了.
====== 2022-12-25 根据大家的建议, 更新了代码, 还是有问题解决不了 ==============
将&mut self
改为 mut self
App的field是vector
use core::future::Future;
use futures::future::{BoxFuture, FutureExt};
struct App {
v: Vec<fn(&mut u8) -> BoxFuture<'_, u8>>
}
impl App {
fn new() -> App {
return App {
v: vec![]
}
}
fn start(mut self) -> Result<(), std::io::Error> {
let v = self.v;
loop {
let n2 = 3u8; // n2必须在此出现, 实际上每次都是新的值
tokio::spawn(async move{
let mut n = 9u8 + n2; // n必须用到n2的值
for f in v {
f(&mut n).await;
println!("n = {}", n);
}
});
}
Ok(())
}
fn set_func(&mut self, f: fn(&mut u8) -> BoxFuture<'_, u8>) -> &mut App {
self.v.push(f);
return self;
}
}
async fn haha(ctx: &mut u8) -> u8 {
dbg!(*ctx);
*ctx = 20;
*ctx
}
#[tokio::main]
async fn main() {
let mut app = App::new();
app.set_func(|ctx| async move { haha(ctx).await }.boxed());
app.start().unwrap();
}
Ext Link: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ef6a8541d4dbe806e6f3b7d61f519180
1
共 13 条评论, 1 页
评论区
写评论感谢! 我试着这么改. 解决了.
--
👇
苦瓜小仔: &'static self 和 &'static mut self 是相当无用的。
你需要掌握所有权
有考虑过, 但是在这里使用在API的角度上有点怪怪的
--
👇
closetool: 有考虑过lazy_static吗 https://colobu.com/2019/09/08/rust-lib-per-week-lazy-static/
有考虑过lazy_static吗 https://colobu.com/2019/09/08/rust-lib-per-week-lazy-static/
--
👇
zjhken: Good Idea! 我更新了代码
--
👇
snylonue: 直接改成
mut self
怎么样&'static self 和 &'static mut self 是相当无用的。
你需要掌握所有权
Good Idea! 我更新了代码
--
👇
snylonue: 直接改成
mut self
怎么样感谢解答. 我更新了代码, 之前的简化太多了. 这次, 在App中的实质上是vec, 而且被编译器要求要在start函数加
'statc
.👇
苦瓜小仔: 函数指针类型实现了 Copy trait
所以,直接传函数指针就行:
函数指针类型实现了 Copy trait
所以,直接传函数指针就行:
playground
直接改成
mut self
怎么样你需要 Arc 而不是 &'static mut
playground
有试过, 但是这样必须unsafe, 所以很纠结
👇
Neutron3529: 为什么不干脆把app定义成static变量呢?
为什么不干脆把app定义成static变量呢?
简单粗暴的绕过下
https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=bd30e576c5127489a4ec8048c6b9af47