热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何使用Rust从stdin创建一个高效的字符迭代器?

如何解决《如何使用Rust从stdin创建一个高效的字符迭代器?》经验,为你挑选了1个好方法。

既然Read::chars迭代器已经被正式弃用了,那么在Reader不将整个流读入内存的情况下获取来自类似stdin 的字符的迭代器的正确方法是什么?



1> Shepmaster..:

相应的弃用问题很好地总结了问题Read::chars并提出了建议:

可以使用不关心递增处理数据的代码 Read::read_to_string.大概需要关注的代码也希望控制其缓冲策略并使用尽可能大的切片&[u8]&str切片,而不是一次char一个.它应该立足于str::from_utf8功能以及对valid_up_toerror_len该方法 Utf8Error 的类型.一个棘手的方面是处理单个char以UTF-8表示多个字节的情况,其中这些字节碰巧在不同的read调用/缓冲区块中分割.(Utf8Error::error_len返回None表明这可能是这种情况.)的utf-8板条箱解决了这一点,但为了是柔性的规定,可能有太多的表面的API被包括在标准库.

当然,以上是针对始终为UTF-8的数据.如果需要支持其他字符编码,请考虑使用 encoding_rsencoding包.

你自己的迭代器

最有效的方面解决方案的数量我/ O调用是阅读一切都变成一个巨大的缓冲String和迭代是:

use std::io::{self, Read};

fn main() {
    let stdin = io::stdin();
    let mut s = String::new();
    stdin.lock().read_to_string(&mut s).expect("Couldn't read");
    for c in s.chars() {
        println!(">{}<", c);
    }
}

你可以将它与答案结合起来是否有自己的String :: chars版本?:

use std::io::{self, Read};

fn reader_chars(mut rdr: R) -> io::Result> {
    let mut s = String::new();
    rdr.read_to_string(&mut s)?;
    Ok(s.into_chars()) // from /sf/ask/17360801/
}

fn main() -> io::Result<()> {
    let stdin = io::stdin();

    for c in reader_chars(stdin.lock())? {
        println!(">{}<", c);
    }

    Ok(())
}

我们现在有一个函数,它char为任何实现的类型返回s 的迭代器Read.

一旦你有这种模式,只需要决定在哪里进行内存分配与I/O请求的权衡.这是一个类似的想法,使用行大小的缓冲区:

use std::io::{BufRead, BufReader, Read};

fn reader_chars(rdr: R) -> impl Iterator {
    // We use 6 bytes here to force emoji to be segmented for demo purposes
    // Pick more appropriate size for your case
    let reader = BufReader::with_capacity(6, rdr);

    reader
        .lines()
        .flat_map(|l| l) // Ignoring any errors
        .flat_map(|s| s.into_chars())  // from /sf/ask/17360801/
}

fn main() {
    // emoji are 4 bytes each
    let data = "";
    let data = data.as_bytes();

    for c in reader_chars(data) {
        println!(">{}<", c);
    }
}

最极端的是为每个角色执行一个I/O请求.这不会占用太多内存,但会产生大量的I/O开销.

务实的答案

将实现复制并粘贴Read::chars到您自己的代码中.它会像以前一样有效.

也可以看看:

是否拥有String :: chars的自有版本?

你如何逐个字符地迭代


推荐阅读
  • 本文介绍了 Python 中的基本数据类型,包括不可变数据类型(数字、字符串、元组)和可变数据类型(列表、字典、集合),并详细解释了每种数据类型的使用方法和常见操作。 ... [详细]
  • DirectShow Filter 开发指南
    本文总结了 DirectShow Filter 的开发经验,重点介绍了 Source Filter、In-Place Transform Filter 和 Render Filter 的实现方法。通过使用 DirectShow 提供的类,可以简化 Filter 的开发过程。 ... [详细]
  • 开发笔记:1035 Password (20) ... [详细]
  • Java 中的控制流与作用域
    本文详细介绍了 Java 中的控制流语句,包括块作用域、if 语句、for 循环、while 循环、do-while 循环、switch 语句以及 break 和 continue 语句的使用方法。通过具体的代码示例,帮助读者更好地理解和应用这些控制流结构。 ... [详细]
  • Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • 短视频app源码,Android开发底部滑出菜单首先依赖三方库implementationandroidx.appcompat:appcompat:1.2.0im ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • Hadoop的文件操作位于包org.apache.hadoop.fs里面,能够进行新建、删除、修改等操作。比较重要的几个类:(1)Configurati ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • Quora问题探讨:26岁开始转行做开发是否太迟? ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
author-avatar
非徒雨思_184
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有