我有以下代码:

pub async fn connect<P: AsRef<Path>>(&self, path: P) -> io::Result<()> {
    sleep(a_while).await;
    return self.socket.connect(path.as_ref());
}

我得到了以下剪辑错误:

note: future is not `Send` as this value is used across an await
note: `P` doesn't implement `std::marker::Send`

现在,我很确定Tokio中有异步功能,可以接受AsRef<Path>,例如UnixDatagram::send_to.

我做错了什么?

推荐答案

你想说的是,任何实现AsRef<Path>的东西都是path.问题是,因为connect可以是另一个线程,所以您需要向P添加约束,它也必须是Send,因为connect可以跨越线程边界.

就这样.

 pub async fn connect<P: AsRef<Path> + Send>(&self, path: P) -> io::Result<()> {
    sleep(a_while).await;
    return self.socket.connect(path.as_ref());
}

但另一个问题是,因为P是一个引用,所以它也必须是Sync,所以您需要进一步的约束:

 pub async fn connect<P: AsRef<Path> + Send + Sync>(&self, path: P) -> io::Result<()> {
    sleep(a_while).await;
    return self.socket.connect(path.as_ref());
}

Rust相关问答推荐

如何在tauri—leptos应用程序中监听后端值的变化?""

为什么幻影数据不能自动推断?

Rust:跨多个线程使用hashmap Arc和rwlock

什么时候铁 rust FFI边界上的panic 是未定义的行为?

如何防止Cargo 单据和Cargo 出口发布( crate )项目

在什么情况下 `..._or()` 比 `..._or_else(|| {})` 更好,为什么?

Cargo.toml:如何有条件地启用依赖项功能?

这个不安全的 Rust 代码有什么问题,所以它可以在 Windows 上运行,但不能在 Ubuntu 上运行?

可选包装枚举的反序列化

如何正确使用git2::Remote::push?

更新 rust ndarray 中矩阵的一行

无法将`&Vec>`转换为`&[&str]`

全面的 Rust Ch.16.2 - 使用捕获和 const 表达式的 struct 模式匹配

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

从 Rust 中的 if/else 中的引用创建 MappedRwLockWriteGuard

仅当满足外部条件时如何添加到 actix web 的路由

如何获得对数组子集的工作可变引用?

我如何将 google_gmail1::Gmail> 传递给线程生成?

在 RefCell 上borrow

为移动和借位的所有组合实现 Add、Sub、Mul、Div