Rust _each的方法存在,但在使用StreamDeckSocket时不满足特征边界
我正试着用那个板条箱,但我很难让它工作 我的实现基本上与给出的示例完全相同:Rust _each的方法存在,但在使用StreamDeckSocket时不满足特征边界,rust,Rust,我正试着用那个板条箱,但我很难让它工作 我的实现基本上与给出的示例完全相同: use futures::future::Future; use std::env; use streamdeck_rs::registration::*; use streamdeck_rs::socket::StreamDeckSocket; //the fields of these structs doesn't matter struct GlobalSettings {} struct ActionSet
use futures::future::Future;
use std::env;
use streamdeck_rs::registration::*;
use streamdeck_rs::socket::StreamDeckSocket;
//the fields of these structs doesn't matter
struct GlobalSettings {}
struct ActionSettings {}
struct MessageToSd {}
struct MessageFromSd {}
fn register() {
let params = RegistrationParams::from_args(env::args()).unwrap();
let connect =
StreamDeckSocket::<GlobalSettings, ActionSettings, MessageFromSd, MessageToSd>::connect(
params.port,
params.event,
params.uuid,
);
tokio::run(
connect
.map_err(|e| println!("connection failed: {:?}", e))
.and_then(|socket| {
socket
.for_each(|message| println!("recieved: {:?}", message))
.map_err(|e| println!("read error: {:?}", e))
}),
);
}
我可以导入
future::Stream
:
use streamdeck_rs::registration::*;
use streamdeck_rs::socket::StreamDeckSocket;
use std::env;
use futures::future::Future;
use futures::Stream;
//rest same as before
我得到了这个错误:
error[E0599]:在当前作用域中找不到类型为'streamdeck_rs::socket::StreamDeckSocket'的名为'for_each'的方法
-->src/main.rs:37:35
|
37 |和|然后(| socket | socket.for |每个(| message | println!(“接收:{:?}”,message))
| ^^^^^^^^
|
=注意:存在“for_each”方法,但不满足以下特征界限:
`&mut streamdeck_rs::socket::streamdeck socket:futures::stream::stream`
`&mut streamdeck_rs::socket::streamdeck socket:std::iter::迭代器`
`streamdeck_rs::socket::StreamDeckSocket:未来::流::流`
警告:未使用的导入:`futures::Stream`
请注意有关未使用导入的警告
因为StreamDeckSocket
是在板条箱中定义的,所以我无法在其上实现任何特性
我知道这个问题有几种形式,但据我所知,这些答案仅适用于我使用的板条箱中缺少特征实现的情况。示例代码片段并不完全正确,但非常接近:
- 结构需要
#[派生(反序列化,调试)]
- 根据,传递给每个的
的闭包类型错误
use futures::future::Future;
use futures::stream::Stream;
use serde::Deserialize;
use std::env;
use streamdeck_rs::registration::*;
use streamdeck_rs::socket::StreamDeckSocket;
#[derive(Deserialize, Debug)]
struct GlobalSettings {}
#[derive(Deserialize, Debug)]
struct ActionSettings {}
#[derive(Deserialize, Debug)]
struct MessageToSd {}
#[derive(Deserialize, Debug)]
struct MessageFromSd {}
fn main() {
let params = RegistrationParams::from_args(env::args()).unwrap();
let connect =
StreamDeckSocket::<GlobalSettings, ActionSettings, MessageFromSd, MessageToSd>::connect(
params.port,
params.event,
params.uuid,
);
tokio::run(
connect
.map_err(|e| println!("connection failed: {:?}", e))
.and_then(|socket| {
socket
.for_each(|message| {
println!("recieved: {:?}", message);
Ok(())
})
.map_err(|e| println!("read error: {:?}", e))
}),
);
}
use futures::future::future;
使用futures::stream::stream;
使用serde::反序列化;
使用std::env;
使用streamdeck_rs::注册::*;
使用streamdeck_rs::socket::StreamDeckSocket;
#[派生(反序列化、调试)]
结构全局设置{}
#[派生(反序列化、调试)]
结构操作设置{}
#[派生(反序列化、调试)]
结构MessageToSd{}
#[派生(反序列化、调试)]
结构MessageFromSd{}
fn main(){
设params=RegistrationParams::from_args(env::args()).unwrap();
让我们联系=
StreamDeckSocket:::连接(
帕拉姆斯港,
params.event,
params.uuid,
);
东京:快跑(
连接
.map_err(| e | println!(“连接失败:{:?}”,e))
.然后(|插座|{
插座
.对于每个(|消息|{
println!(“接收:{:?}”,消息);
好(())
})
.map_err(| e | println!(“读取错误:{:?}”,e))
}),
);
}
您肯定希望每个()都有futures::Stream
中的
方法,因此您需要将该特性纳入范围。如果这导致进一步的错误,请将其添加到问题中,以便我们能够找出解决方法。@SvenMarnach添加了有关futures::Stream
错误的更多详细信息streamdeck\r
和futures
的版本是什么您正在使用?快速查看文档,似乎StreamDeckSocket
应该实现Stream
。还要注意的是,您的一些结构需要。[派生(反序列化)]
。您能解释一下上每个的类型吗?它是否需要实际返回Ok())
?我还在努力学习如何阅读锈迹类型的签名。@Max,当然可以。基本上,表示它需要一个类型为FnMut(Self::Item)->U
的闭包,它接受一个参数并返回U
类型的东西。那U
是IntoFuture
的缩写。反过来说,它要么解析为Item
类型的值,要么解析为error
类型的错误。在本例中,项
只是()
。因此,返回Ok(())
。也就是说,这里的rustc错误消息非常不透明,很难解析。诊断有改进的余地。幸运的是,rust lang项目已经跟踪了上述诊断的进度。