【发布时间】:2020-09-25 11:57:04
【问题描述】:
我试图通过引入类型别名来缩短函数签名。 参数的类型说明是这样的
writer: Arc<Mutex<&mut (dyn AsyncWrite + Unpin + Send + Sync)>> // working
我认为可以通过引入这种类型别名来缩短它
pub type RefAsyncWriter<'a> = &'a mut (dyn AsyncWrite + Unpin + Send + Sync);
所以类型参数就变成了
writer: Arc<Mutex<RefAsyncWriter>> // error[E0726]: implicit elided lifetime not allowed here
不幸的是,这种变化给我带来了一生的麻烦。
这里我做了一个简单的例子
use tokio::io::AsyncWrite;
use tokio::fs::File;
use std::sync::{Arc,Mutex};
use std::path::PathBuf;
pub type RefAsyncWriter<'a> = &'a mut (dyn AsyncWrite + Unpin + Send + Sync);
#[tokio::main]
async fn main() {
let f = File::create(PathBuf::from("/tmp/test.txt")).await.unwrap();
w(Arc::new(Mutex::new(&mut f)));
}
async fn w(writer: Arc<Mutex<RefAsyncWriter>>) {
// TODO
}
结果如下
Compiling playground v0.0.1 (/playground)
error[E0726]: implicit elided lifetime not allowed here
--> src/main.rs:13:31
|
13 | async fn w (writer: Arc<Mutex<RefAsyncWriter>>) {}
| ^^^^^^^^^^^^^^- help: indicate the anonymous lifetime: `<'_>`
error: aborting due to previous error
如果有人可以向我解释 (1) 是否有办法让它工作,也许 (2) 为什么类型别名实际上会对编译器产生如此大的帮助。
非常感谢。
【问题讨论】: