- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解如何为自己的类型编写trait
和impl
,以处理一些输入数据。我从一个简单的示例开始,在该示例中,我想使用1, 2, 3, 4
处理输入的trait Processor
。一个实现将跳过第一个元素,并将所有其余输入加倍。因此,它应如下所示:
trait Processor {} // TBD
struct SkipOneTimesTwo;
impl Processor for SkipOneTimesTwo {} // TBD
let numbers = vec![1, 2, 3, 4];
let it = numbers.iter();
let it = Box::new(it);
let proc = SkipOneTimesTwo;
let four_to_eight = proc.process(it);
assert_eq!(Some(4), four_to_eight.next());
assert_eq!(Some(6), four_to_eight.next());
assert_eq!(Some(8), four_to_eight.next());
assert_eq!(None, four_to_eight.next());
所以我的假设是我的特征和相应的实现看起来像这样:
trait Processor {
// Arbitrarily convert from `i32` to `u32`
fn process(&self, it: Box<dyn Iterator<Item = i32>>) -> Box<dyn Iterator<Item = u32>>;
}
struct SkipOneTimesTwo;
impl Processor for SkipOneTimesTwo {
fn process(&self, it: Box<dyn Iterator<Item = i32>>) -> Box<dyn Iterator<Item = u32>> {
let p = it.skip(1).map(|i| 2 * (i as u32));
Box::new(p)
}
}
此代码无法按原样工作。我收到以下错误:
7 | let four_to_eight = proc.process(it);
| ^^ expected `i32`, found reference
|
= note: expected type `i32`
found reference `&{integer}`
= note: required for the cast to the object type `dyn Iterator<Item = i32>`
如果我的输入数据非常大,我不希望将整个数据集都保存在内存中(使用
Iterator
的整个要点),因此我假设使用
Iterator<T>
应该从原始输入源流式传输数据,直到将其输入为止。最终汇总或以其他方式处理。但是,我不知道这意味着什么,我需要在此注释的生命周期。
Processor
可能保存来自输入的一些中间数据(例如,用于运行平均值计算),因此我可能必须在结构上指定生存期。
'a
,
'static
和
'_
生存期添加到
dyn Iterator<...>
中,但是我不太清楚如何传递输入迭代器并延迟修改值。
Iterator<Item = i32>
存储在我的struct和
impl Iterator<Item = u32> for SkipOneTimesTwo
中,但是随后我可能会失去一些能够绕过
Processor
特性的抽象概念。
最佳答案
Rust中的所有迭代器都是惰性的。另外,您不需要使用生存期,只需使用 into_iter()
而不是 iter()
即可编译代码:
trait Processor {
fn process(&self, it: Box<dyn Iterator<Item = i32>>) -> Box<dyn Iterator<Item = u32>>;
}
struct SkipOneTimesTwo;
impl Processor for SkipOneTimesTwo {
fn process(&self, it: Box<dyn Iterator<Item = i32>>) -> Box<dyn Iterator<Item = u32>> {
let p = it.skip(1).map(|i| 2 * (i as u32));
Box::new(p)
}
}
fn main() {
let numbers = vec![1, 2, 3, 4];
let it = numbers.into_iter(); // only change here
let it = Box::new(it);
let pro = SkipOneTimesTwo;
let mut four_to_eight = pro.process(it);
assert_eq!(Some(4), four_to_eight.next());
assert_eq!(Some(6), four_to_eight.next());
assert_eq!(Some(8), four_to_eight.next());
assert_eq!(None, four_to_eight.next());
}
playground
关于rust - 如何为迭代器写trait&impl with lifes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65781788/
我想实现一个转换特性,涵盖支持现有转换的所有类型。我认为这可以通过以下方式完成: impl Into for T where T: Into, { fn into(self) -> B {
看来我不能在 Rust 中调用相同结构的方法,或者我不明白: struct St1 { aa: String } impl St1 { pub fn method1() -> String {
我正在使用 pimpl idiom在我的代码中有很多,主要是为了减少编译时间。 我遇到了调用 C 库的情况。我有一个 C++ 包装器类,它有它的接口(interface),血淋淋的细节都在 impl
我有以下代码: use std::ops::Div; use std::ops::Mul; #[derive(Debug)] struct Foo { bar: T, } impl Foo w
从 Rust 1.34 开始,我们可以通过实现 TryFrom 来编写类型之间的易错转换。特征: struct Foo(i32); struct Bar; impl TryFrom for Foo {
我开始了一个非常小的程序来玩 Rust 中的解析器组合器,很快就遇到了一个我觉得很奇怪的错误: trait Parser { fn parse(&self, input: &'a [u8])
这个问题在这里已经有了答案: NoSuchMethodError: org.slf4j.impl.StaticLoggerBinder.getSingleton() (4 个答案) 关闭 5 年前。
在扩展其他 crate 中定义的 trait 时,似乎有两种方法可以默认实现新的 trait。 特征的原始定义是 pub trait Trait1 { fn f1(&self); } 为了扩展
我通过扩展 AbstractEntryProcessor 创建了用于更新 map 条目的自定义条目处理器。当我的应用程序在两个实例上的集群中运行并且执行入口处理器时,我收到以下异常: com.haze
我的本地环境:OSX 10.9.2,java1.6 我使用 java api 连接 hbase 和 maven 来管理我的项目,我将 Hbase-0.94.17 和 Hadoop-core-1.0
包装一些生成的类,我使用 classImpl 绑定(bind),但生成的类中的集合返回生成的类型而不是 classImpl 中的类型,我当然想要一个 classImpl 列表...... 我的 xsd
我正在编写一个守护程序来获取某些游戏的服务器统计信息。 在编译中我收到一条消息: cannot access org.apache.commons.pool2.impl.GenericObjectPo
我最近将旧应用程序的后台服务迁移到 WorkManager .在最近的设备上(低至 sdk 22 包括 )它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。 问题是当我测试旧版本时(旧
这个问题在这里已经有了答案: Xerces error: org.apache.xerces.impl.dv.dtd.DTDDVFactoryImpl (2 个答案) 关闭 5 年前。 我正在使用
如果我有一个需要Default实现的结构,如果所有字段的类型都有Default实现的themsevles,那么我可以使用derive 宏,否则我需要手动实现 Default。但是,在某些情况下,我有一
我看到 Rust 代码库中经常出现以下模式,但我找不到解释为什么要使用它。 将 impl ... for 用于什么目的? build ? 伪代码: impl Handler { pub fn
我用 Angular js 编写了一些小代码。它有效,但我收到一些错误“无法读取未定义的属性'impl'”。有人知道那是什么吗? 这是我的 html:
我正在尝试创建一个通用实现,用于根据不同的字段类型生成 From/Into。 Link to Playground 我发现了以下问题: error[E0425]: cannot find value
在下面传递一个trait作为参数的例子中,在函数签名中发送impl需要什么? 我知道 traits 是更通用的类型而不是具体类型,但是由于 Rust 编译器不允许跨结构和 traits 共享名称,为什
我有一个带有两个通用 typenum 参数的实现。当参数相同时,impl 的函数应该返回不同的类型。 (不同类型是一种更紧凑的表示,只有当类型参数相同时才能实现。)是否可以使用基于类型相等性的不同实现
我是一名优秀的程序员,十分优秀!