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),
}
例子
标准库的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的更多相关文章
- Rust trait
Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...
- Scala入门系列(八):面向对象之trait
基础知识 1 将trait作为接口使用 此时Trait就与Java中的接口非常类似,不过注意,在Scala中无论继承还是trait,统一都是extends关键字. Scala跟Java 8前一样不支持 ...
- 【转】PHP的Trait 特性
Trait是在PHP5.4中加入的,它既不是接口也不是类.主要是为了解决单继承语言的限制.是PHP多重继承的一种解决方案.例如,需要同时继承两个 Abstract Class, 这将会是件很麻烦的事情 ...
- Beginning Scala study note(7) Trait
A trait provides code reusability in Scala by encapsulating method and state and then offing possibi ...
- Scala Trait
Scala Trait 大多数的时候,Scala中的trait有点类似于Java中的interface.正如同java中的class可以implement多个interface,scala中的cals ...
- Scala学习笔记--特质trait
http://outofmemory.cn/scala/scala-trait-introduce-and-example 与Java相似之处 Scala类型系统的基础部分是与Java非常相像的.Sc ...
- php中trait
1.简介 自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制.Trait 为了减少单继承语言的限制,使 ...
- Scala编程入门---面向对象编程之Trait高级知识
trait调用链 Scala中支持让类继承多个Trait后,依次调用多个Trait中的同一个方法,只要让多个trait的同一个方法中,在最后都执行super.方法即可 类中调用多个trait中都有这个 ...
- PHP 中的Trait
概述 在PHP中有一种代码复用的技术, 因为单继承的问题, 有些公共方法无法在父类中写出, 而 Trait可以应对这种情况, 它可以定义一些复用的方法, 然后在你需要使用的类中将其引入即可. 刚开始的 ...
- Spark基础-scala学习(三、Trait)
面向对象编程之Trait trait基础知识 将trait作为接口使用 在trait中定义具体方法 在trait中定义具体字段 在trait中定义抽象字段 trait高级知识 为实例对象混入trait ...
随机推荐
- 简单的php奥运倒计时牌
1 <?php 2 3 date_default_timezone_set ( "Asia/Shanghai" ); 4 $kaimu = mktime ( 4, 0, 0, ...
- Kafka入门实战教程(6):调优Kafka的实践
1 调优Kafka的目标 通常来说,任何系统调优的目标都是为了满足系统常见的非功能性需求,而性能则是众多非功能性需求中最重要的一个. 不同的系统对性能的侧重点不同,DB的话性能是响应时间,而对于Kaf ...
- git 在C# 中常用的忽略文件配置
.gitignore文件 .vs *.vssscc obj bin /packages *.vspscc */Properties/PublishProfiles *.log 简易的命令行入门教程: ...
- SQL server 获取各种 约束信息
https://bbs.csdn.net/topics/380103485 --获取约束信息 select * from information_schema.constraint_column_ ...
- listmap根据某字段进行合并
public List<Map<String, Object>> mergeResult(List<Map<String, Object>> m1, L ...
- 记录java使用openoffice将office转pdf遇到的问题
openoffice使用方法:使用openOffice将office文件转成pdf 遇到了这个问题: 将 DocumentConverter converter = new OpenOfficeDoc ...
- [Compose Multiplatform Desktop] 比官方更好的Compose预览
前提概要 Compose Multiplatform 是从 Android 的 Jetpack Compose 发展而来的. 所以 Compose 在 Android 上功能最完善,其次是 Deskt ...
- centos如何部署vue项目
centos如何部署vue项目 前言 最近做了一个AI应用,通过大模型可以生成图片.并合成适视频,也有一点有趣. 后端是基于fastapi的,前端是vue. 但是在部署vue的是时候,有点犯难. 职业 ...
- SpringBoot--Profile你用对了吗
所谓Profile,就是一组配置环境,各种程序组件的合集. 实际开发中,经常要在不同的环境间切换,比如,开发时应用的是开发场的部署环境:测试时,用的是测试场的部署环境:上线时,用的是产品场的部署环境. ...
- AD 提权-NTLM 中继攻击(诱导认证)
我醉欲眠卿且去,明朝有意抱琴来. 导航 0 前言 1 实验环境 2 SMB 转 SMB 3 SMB 转 LDAP 4 SMB 转 HTTP 5 HTTP 转 SMB 6 HTTP 转 LDAP 7 杂 ...