gpt4 book ai didi

rust - Rust类型别名导致生命周期问题

转载 作者:行者123 更新时间:2023-12-03 11:33:54 24 4
gpt4 key购买 nike

我试图通过引入类型别名来缩短函数签名。
参数的类型说明如下所示

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
(请参阅: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=eb46708a9df66efa0de419a8d98490cf)
如果有人可以向我解释(1)是否有办法使它起作用,也许(2)为什么类型别名实际上会对编译器产生如此大的影响,这将有很大的帮助。
在此先多谢。

最佳答案

由于您在类型别名中引入了显式的生存期'a,因此在使用此类型时需要指定它。

async fn w<'a>(writer: Arc<Mutex<RefAsyncWriter<'a>>>) {}
它似乎可以在您提供的操场上工作。
而且正如编译器所建议的那样,匿名litetime是等效的。
async fn w(writer: Arc<Mutex<RefAsyncWriter<'_>>>) {}

函数的原始版本(在 writer:之后记下的很长的类型在某种程度上等效于 this documentation中的 print1()print2()print3()
如果您将引用作为参数引入,则此函数必定存在生存期参数;当此生命周期不可能引起混淆时,省略可以带来一些舒适感,从而节省了一些击键。
当定义一个包含引用的类型别名时,编译器希望我们使生存期明确,这可能是为了防止使用此类型别名的人忘记内部隐藏了一个引用。
然后,使用此类型别名需要 <'...>表示法。
但是同样,当使用时没有混淆时,匿名的生存期 <'_>会保存一些击键,避免两次(在函数名之后和在参数中)写入 <'a>

关于rust - Rust类型别名导致生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64063687/

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