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),
}

例子

标准库的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中怎么创建一个可读写的内存对象 里提到了用Cursor来实现类似python StringIO库的方法,值得一看

rust trait 熟识系列:一日一trait之Seek trait的更多相关文章

  1. Rust trait

    Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...

  2. Scala入门系列(八):面向对象之trait

    基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...

  3. 【转】PHP的Trait 特性

    Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情 ...

  4. Beginning Scala study note(7) Trait

    A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...

  5. Scala Trait

    Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...

  6. Scala学习笔记--特质trait

    http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...

  7. php中trait

    1.简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使 ...

  8. Scala编程入门---面向对象编程之Trait高级知识

    trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...

  9. PHP 中的Trait

    概述 在PHP中有一种代码复用的技术, 因为单继承的问题, 有些公共方法无法在父类中写出, 而 Trait可以应对这种情况, 它可以定义一些复用的方法, 然后在你需要使用的类中将其引入即可. 刚开始的 ...

  10. Spark基础-scala学习(三、Trait)

    面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...

随机推荐

  1. 简单的php奥运倒计时牌

    1 <?php 2 3 date_default_timezone_set ( "Asia/Shanghai" ); 4 $kaimu = mktime ( 4, 0, 0, ...

  2. Kafka入门实战教程(6):调优Kafka的实践

    1 调优Kafka的目标 通常来说,任何系统调优的目标都是为了满足系统常见的非功能性需求,而性能则是众多非功能性需求中最重要的一个. 不同的系统对性能的侧重点不同,DB的话性能是响应时间,而对于Kaf ...

  3. git 在C# 中常用的忽略文件配置

    .gitignore文件 .vs *.vssscc obj bin /packages *.vspscc */Properties/PublishProfiles *.log 简易的命令行入门教程: ...

  4. SQL server 获取各种 约束信息

    https://bbs.csdn.net/topics/380103485   --获取约束信息 select * from information_schema.constraint_column_ ...

  5. listmap根据某字段进行合并

    public List<Map<String, Object>> mergeResult(List<Map<String, Object>> m1, L ...

  6. 记录java使用openoffice将office转pdf遇到的问题

    openoffice使用方法:使用openOffice将office文件转成pdf 遇到了这个问题: 将 DocumentConverter converter = new OpenOfficeDoc ...

  7. [Compose Multiplatform Desktop] 比官方更好的Compose预览

    前提概要 Compose Multiplatform 是从 Android 的 Jetpack Compose 发展而来的. 所以 Compose 在 Android 上功能最完善,其次是 Deskt ...

  8. centos如何部署vue项目

    centos如何部署vue项目 前言 最近做了一个AI应用,通过大模型可以生成图片.并合成适视频,也有一点有趣. 后端是基于fastapi的,前端是vue. 但是在部署vue的是时候,有点犯难. 职业 ...

  9. SpringBoot--Profile你用对了吗

    所谓Profile,就是一组配置环境,各种程序组件的合集. 实际开发中,经常要在不同的环境间切换,比如,开发时应用的是开发场的部署环境:测试时,用的是测试场的部署环境:上线时,用的是产品场的部署环境. ...

  10. AD 提权-NTLM 中继攻击(诱导认证)

    我醉欲眠卿且去,明朝有意抱琴来. 导航 0 前言 1 实验环境 2 SMB 转 SMB 3 SMB 转 LDAP 4 SMB 转 HTTP 5 HTTP 转 SMB 6 HTTP 转 LDAP 7 杂 ...