Rust 创建连接到共享状态的循环Tokio流

Rust 创建连接到共享状态的循环Tokio流,rust,stream,rust-tokio,Rust,Stream,Rust Tokio,我遇到了一个我并不真正理解和希望的问题 也许有人能看出我误解了什么 问题很简单:我有一个全局状态(共享) 在多个任务之间)并希望在一个任务上有一个无限循环 全局状态中的向量。然后,我将在一段时间内关闭它 流中的下一个值的规则发射 小溪 如果状态中的向量发生变化,INI有限流应该 重新加载矢量并从新矢量开始读取,然后 丢弃旧阵列 这是我得到的代码,问题在 这篇文章的结尾 use futures::stream::stream; 使用未来:{Async,Poll}; 使用std::iter::Cyc

我遇到了一个我并不真正理解和希望的问题 也许有人能看出我误解了什么

问题很简单:我有一个全局状态(共享) 在多个任务之间)并希望在一个任务上有一个无限循环 全局状态中的向量。然后,我将在一段时间内关闭它 流中的下一个值的规则发射 小溪

如果状态中的向量发生变化,INI有限流应该 重新加载矢量并从新矢量开始读取,然后 丢弃旧阵列

这是我得到的代码,问题在 这篇文章的结尾

use futures::stream::stream;
使用未来:{Async,Poll};
使用std::iter::Cycle;
使用std::sync::{Arc,Mutex};
使用std::time::{Duration,Instant};
使用tokio::timer::Interval;
我们定义了一个全局状态,其中包含一个可以 更新。每当更新阵列时,我们都会逐步更新版本和 设置数组

struct状态{
版本:u32,
数组:Vec,
}
impl状态{
fn新(阵列:Vec)->Self{
自我{
版本:0,
数组:Vec::new(),
}
}
fn更新(&mut self,数组:Vec){
self.version+=1;
self.array=数组;
}
}
现在,我们在州上创建一个流。初始化时,它将 从状态读取数组和版本并存储它,然后保留
std::iter::Cycle
的一个内部实例,将在 数组

struct StateStream{
国家:Arc,
版本:u32,
iter:循环,
}
impl状态流
哪里
I:迭代器,
{
fn新(状态:Arc)->自{
let(版本、阵列)={
让locked_state=state.lock().unwrap();
(locked_state.version,locked_state.array)
};
自我{
州:州,,
版本:版本,,
iter:array.iter().cycle(),
}
}
}   
现在,我们为
状态流
实现流。每一次民意测验都是如此 将检查状态的版本是否更改,如果更改,则重新加载 数组和版本

然后,我们将从迭代器中获取下一项并返回该项

impl Stream for StateStream
哪里
I:迭代器+克隆,
{
类型Item=I::Item;
类型错误=();
fn轮询(&mut self)->轮询{
让locked_state=self.state.lock().unwrap();
如果锁定_state.version>self.version{
self.iter=locked_state.array.clone().iter().cycle();
self.version=locked_state.version;
}
Ok(Async::Ready(self.iter.next())
}
}
主程序如下所示。这里我不更新向量,但是 这对目前的情况并不重要

fn main(){
让state=Arc::new(Mutex::new(state::new(vec![2,3,5,7,11,13]));
让primes=StateStream::new(state)
.take(20)
zip先生(
间隔::新(瞬间::现在(),持续时间::从_millis(500))
.map_err(| err | println!(“Error:{}”,err)),
)
.对于每个(|(数字,瞬间)|{
println!(“火;数字={},瞬间={:?}”,数字,瞬间);
好(())
});
东京:运行(素数);
}
编译此文件时,出现以下错误:

cargo run --example cycle_stream_shared
   Compiling tokio-testing v0.1.0 (/home/mats/crates/tokio-examples)
error[E0308]: mismatched types
  --> examples/cycle_stream_shared.rs:66:19
   |
66 |             iter: array.iter().cycle(),
   |                   ^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::slice::Iter`
   |
   = note: expected type `std::iter::Cycle<I>`
              found type `std::iter::Cycle<std::slice::Iter<'_, <I as std::iter::Iterator>::Item>>`

error[E0308]: mismatched types
  --> examples/cycle_stream_shared.rs:81:25
   |
81 |             self.iter = locked_state.array.clone().iter().cycle();
   |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter, found struct `std::slice::Iter`
   |
   = note: expected type `std::iter::Cycle<I>`
              found type `std::iter::Cycle<std::slice::Iter<'_, <I as std::iter::Iterator>::Item>>`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
error: Could not compile `tokio-testing`.

To learn more, run the command again with --verbose.
cargo run——示例循环\u流\u共享
编译东京试验v0.1.0(/home/mats/crates/tokio示例)
错误[E0308]:类型不匹配
-->示例/循环\u流\u共享。rs:66:19
|
66 | iter:array.iter().cycle(),
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^`
|
=注:应为'std::iter::Cycle'类型`
找到类型`std::iter::Cycle>`
错误:由于之前的两个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0308”。
错误:无法编译“东京测试”。
要了解更多信息,请使用--verbose再次运行该命令。
现在,错误和解释说具体类型不是 可以派生,但在本例中,我使用的是泛型结构
Cycle
并期望将
I
实例化为
std::slice::iter为什么不使用:
StateStream,其中I:Iterator
如果我想要一个通用的
StateStream
,这是可能的,但在这种情况下,我通过使用一个具体的类型使问题变得更简单。您的问题可能要小得多。它归结为这样一个事实:编译器不能推断出
I
。可能的重复,但它是一个泛型结构,它是
Cycle
,它试图匹配
Cycle
,这不能推断出
I
std::slice::Iter
?为什么不使用:
状态流,其中I:Iterator
是可能的,如果我想要一个通用的
状态流
,但在本例中,我使用了一个具体的类型使问题变得更简单。您的问题可能会小得多。它归结为编译器无法推断出
I
。的可能副本,但它是一个泛型结构,它是
Cycle
,并尝试匹配
Cycle
,这不能推断
I
std::slice::Iter