关于字符串,初学的时候总想着多用引用降低开销,结果一到字符串的&str就各种碰壁,结构体的生命周期标记对于初学者实在有点超纲了,好在String还算比较好用,遇事不决clone拉倒。
读过一些仓库的代码,绝大多数项目存储字符串还是用String,少部分用Vec<u8 大概是方便修改和传输,actix还封装了个Bytes,不过似乎都没见过人用,国人项目还有用Vec<char 的,应该是方便修改汉字,不过在英语社区似乎对Vec<char 十分不屑,动辄就是emoji无法被index。
cow<'a, str>的概念也好几年了,现在连serde等序列化库也支持了,最近看了很多cow的文章和讨论,感觉自己可能又行了,有点想把一部分String相关的代码换成cow<'a, str>。
所以问问各位用过cow的大佬,在项目中用cow是什么体验,有什么爽点和坑点,实现上会不会频繁被绊住,有没有什么可以参考的开源项目范例?
Ext Link: https://github.com/rust-lang/rust/blob/master/library/alloc/tests/cow_str.rs
1
共 10 条评论, 1 页
评论区
写评论后来搜cow string又搜到两个第三方库,不过不知道用起来会怎么样,
cow-utils
,cowstr
查了下,发现了个https://crates.io/crates/beef,算是cow的升级版,定义字符串是
cow<str>
,不用标记生命周期了,而且把len和cap压缩进一个64位里变成两个32位,不过没有重载加运算,感觉也还不太行。Rc<str第一次听说啊,感觉好像也不是不行,但具体工程上用起来没问题吗
--
👇
araraloren: 简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了
Rc<str>
来规避这个问题.生命周期还真是老大难啊,有没有可能把clone on write封装成类似于box这样不用标生命周期的智能指针。印象中官方论坛好像也讨论过为什么不用box<str 替代String的方案,但论点是啥给忘了。cow<'_, str 的缺点貌似就是运行时枚举开销和生命周期泛型增加系统复杂度。
大部分http库都用
Bytes
,actix是抄了http
中ByteStr
的代码,所以没人用Rc 啥用法?指点下?
--
👇
araraloren: 简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了
Rc<str>
来规避这个问题.简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了
Rc<str>
来规避这个问题.如果是基础的结构体里挂个有带生命周期的字段. 到处传递,有时还当闭包参数,简直不要太酸爽. 整天不干别的就跟编译器都斗争了
一般对于上层业务来讲,清晰性易用性和性能之间,我取前者。
对于底层库级的,取舍又不一样了。
cow 最主要的问题是带生命周期泛型,你说好不好用呢🤣