gpt4 book ai didi

rust - * mut(dyn std::ops::Fn()+ 'static)`无法使用serde::de::DeserializeOwned结构在线程之间安全共享

转载 作者:行者123 更新时间:2023-12-03 11:31:40 29 4
gpt4 key购买 nike

我正在尝试将Iced (UI framework based on The Elm Architecture)与可以使用Reqwest (wrapper over hyper)Serde for JSON deserialisation一起使用。

它们独立地可以正常工作,但是我对Rust还是陌生的,关于实现的某些知识是错误的。

我从一个(进行中的)网络功能开始。

#[derive(Deserialize, Debug, Clone)]
pub(crate) enum Error {
APIError,
ParseError,
}

impl From<reqwest::Error> for Error {
fn from(error: reqwest::Error) -> Self {
Error::APIError
}
}

pub(crate) async fn post<T>(request: Request) -> Result<T, Error>
where
T: DeserializeOwned + Debug + Clone,
{
let headers = standard_headers(request.params);
let response = Client::new()
.post(&format!("{}{}", request.base, request.path))
.json(&request.body)
.headers(headers)
.send()
.await?
.json::<T>()
.await?;

Ok(response)
}

我尝试将其用作Iced的一部分:
fn new() -> (Runner, Command<Message>) {
(
Runner::Loading,
Command::perform(post(Login::request()), Message::Next),
)
}


并且我收到以下编译错误:
error[E0277]: `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely
--> src/feature/runner/runner.rs:42:13
|
42 | Command::perform(post(Login::request()), Message::Next),
| ^^^^^^^^^^^^^^^^ `*mut (dyn std::ops::Fn() + 'static)` cannot be shared between threads safely
|
::: <snip>/futures/src/command/native.rs:29:22
|
29 | future: impl Future<Output = T> + 'static + Send,
| ------------------ required by this bound in `iced_futures::command::native::Command::<T>::perform`
|
= help: within `core::fmt::Void`, the trait `std::marker::Sync` is not implemented for `*mut (dyn std::ops::Fn() + 'static)`

我相信问题与在 post中使用 T: DeserializeOwned and life times有关,因此所有权是这样的,即 T中的 async fn post类型可能与Command中的异步调用位于不同的线程上(因此提到了 Send

答案甚至可能在终身链接中,但是我还没有足够的知识来了解它,或者不知道自己的想法是否在正确的地方。我调试回到仅使用一种具体类型,而不是 T起作用。

我很想了解为什么会出现这个问题,以及我可以采取什么措施来解决它。

提前致谢!

最佳答案

这个提示:

help: within `core::fmt::Void`, the trait `std::marker::Sync` is not implemented for `*mut (dyn std::ops::Fn() + 'static)`

让我认为整个问题与您在 format!中使用 fn post有关(请参阅 https://github.com/rust-lang/rust/issues/64960)。尝试升级rust编译器或将URL移到 .await长链之前:

let url = format!("{}{}", request.base, request.path);
let response = Client::new()
.post(&url)
// ...

关于rust - * mut(dyn std::ops::Fn()+ 'static)`无法使用serde::de::DeserializeOwned结构在线程之间安全共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60583622/

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