IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Rust Trait熟识:一日一trait之Seek trait -> 正文阅读

[大数据]Rust Trait熟识:一日一trait之Seek trait


> Seek 顾名思义就是用来方便查找的trait,其内部提供了一个在字节流(stream of bytes)移动的游标(cursor),移动游标
可以改变操作字节流的位置。


## Seek trait 定义

```
pub trait Seek {
? ? fn seek(&mut self, pos: SeekFrom) -> Result<u64>;
? ? fn rewind(&mut self) -> Result<()> { ... }
?? ?fn stream_len(&mut self) -> Result<u64> { ... }
?? ?fn stream_position(&mut self) -> Result<u64> { ... }
}
```

seek所需方法参数SeekFrom定义了IO对象查找的可能方法

```
pub enum SeekFrom {
? ? Start(u64),
? ? End(i64),
? ? Current(i64),
}
```

<h3> 例子 </h3>?

标准库的`File`实现了`Seek` trait

```
use std::io;
use std::io::prelude::*;
use std::fs::File;
use std::io::SeekFrom;

fn main() -> io::Result<()> {
? ? let mut f = File::open("foo.txt")?;

? ? // move the cursor 42 bytes from the start of the file
? ? f.seek(SeekFrom::Start(42))?;
? ? Ok(())
}
```

## Cursor?

`cursor` 实现了Seek trait,用来包装 内存缓存(in-memory buffer)。
说白了,任意实现了`AsRef<[u8]>`的类型,用Cursor包装后,就实现了`Read` trait 和`Write` trait。
比如标准库里就有`Cursor<Vec<u8>>`和`Cursor<&[u8]>`这样的使用例子。

```
use std::io::Cursor;
use std::io::{SeekFrom};
use std::io::prelude::*;

fn main() {

? ? let mut buff = Cursor::new(vec![0;15]);
? ? buff.seek(SeekFrom::End(-10)).unwrap();
? ? for i in 0..10 {
? ? ?? ?buff.write(&[i]).unwrap();
? ? }
? ? println!("{:?}", buff);
}
```

上面用Cursor包装了Vec, 并且将cursor移动到了倒数第10个的位置写入,结果为:

````
Cursor { inner: [0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], pos: 15 }
````

[在rust中怎么创建一个可读写的内存对象](https://stackoverflow.com/questions/41069865/how-to-create-an-in-memory-object-that-can-be-used-as-a-reader-writer-or-seek) 里提到了用Cursor来实现类似python StringIO库的方法,值得一看

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-03 16:10:38  更:2022-01-03 16:11:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:44:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码