Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust _each的方法存在,但在使用StreamDeckSocket时不满足特征边界_Rust - Fatal编程技术网

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项目已经跟踪了上述诊断的进度。