Rust 的字符串本质上是 u8 序列,但是很多时候从 u8 序列转换回字符串是有风险的,毕竟并不是所有的 u8 序列都是有效的 字符串。
所以原则上来说,能直接使用 char 对字符串处理是最好的。

字符串与Chars

通过 str.chars() 可以获得一个 Chars 结构,他的定义如下

1
2
3
pub struct Chars<'a> {
iter: slice::Iter<'a, u8>,
}

但它是一个迭代器,字符串处理中经常需要随机访问,Chars.nth(mut n: usize) 可以获取到第 N 个字符(其实这是一个 Iterator trait 的方法),但是代价是这是一个 O(n) 的操作。通过空间换时间,可以这么做

1
let chars = s.chars().collect::<Vec<_>>();

不过当大部分操作都是顺序操作的时候,用迭代器才是最优解。

substring

我找了一圈,没找到这个在其他语言中司空见惯的方法,不过想来 Java 中 substring 是一份复制,Rust 中对于复制总是谨慎的。
并且由于对于一个 String/str 任意位置的做切片是一件很危险的事情,因为他不能保证切片位置不是一个 Unicode 字符中间,所以最佳的方案,依旧是——处理一个 Vec<char>

这份年终总结,本应当在元旦出炉,但是差不多一年多没写过什么文字了,一直无处下手。

2019 年,是我跳出体制内工作的第二年,生活逐步平稳,踏上了七八年前早就应当行走的轨迹。

先翻出来年初时候定的计划吧。

b4YNMU7HSAQf89u

技术

其实还是看完了不少书,主要涵盖在 Android 精进和 Rust 上。

播放器

这一年,主要在播放器与解码上精进,看完了以下源代码

  • ExoPlayer
  • IjkPlayer
  • FFmpeg

毕竟作为 Android 开发,主要精力都放在 Android 之上,除了以上,这一年还精进了一些内容

OpenGL ES

本质上和 OpenGL 没太大区别,学了 2 和 3,无奈 Android 上 3 基本处于不可用状态,顺带看了很多 RFC,一些 Android 专用的扩展(KHR,说你呢……

Jetpack

这玩意必不可少,主要集中在

  • Paging
  • Navigation
  • Room
  • 新的 Fragment 与 Activity
  • ViewModel
  • Lifecycle

Rust

我终于看完了几本 Rust 的书,包括实体书和电子版,不过目前看来纯的 Rust 没有我实践的余地,新年伊始,我开始啃 Unsafe Rust 部分,希望今年能写点东西出来。

生活

今天是在一起的 276 天~ 撒花~

10 月公司没了健身房,近两个月没有运动,体重稳定在了 100kg,新年伊始开始恢复。

慢慢的习惯了在北京的生活,过年不打算回家。

总结

2019 年有点……不知所措,现在看来不知道说点什么好,感觉没干什么。新的一年,继续加油吧~

由于几个月前的一次 hexo 升级失误,导致整个 blog 的源码(包括配置和_posts)都丢失了(手贱的 mv 命令),工作大半年以来,竟然没有一篇文章产出,实在是令我自己心酸。

不过好在,原来的站点内容都还在,只能是费点功夫再从生成的代码还原。

最近业务组 iOS 明显少于 Android,所以工作出现了难得的不饱和,在做技术升级的同时,就有了一些时间来做沉淀与提升。把 Blog 重新搞起来,把评论也做起来,强迫自己。