< 返回版块

lithbitren 发表于 2023-02-10 01:22

Tags:cow,string

关于字符串,初学的时候总想着多用引用降低开销,结果一到字符串的&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

评论区

写评论
作者 lithbitren 2023-02-12 00:19

后来搜cow string又搜到两个第三方库,不过不知道用起来会怎么样,cow-utilscowstr

作者 lithbitren 2023-02-11 23:27

查了下,发现了个https://crates.io/crates/beef,算是cow的升级版,定义字符串是cow<str>,不用标记生命周期了,而且把len和cap压缩进一个64位里变成两个32位,不过没有重载加运算,感觉也还不太行。

作者 lithbitren 2023-02-10 18:09

Rc<str第一次听说啊,感觉好像也不是不行,但具体工程上用起来没问题吗

--
👇
araraloren: 简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了Rc<str>来规避这个问题.

作者 lithbitren 2023-02-10 17:54

生命周期还真是老大难啊,有没有可能把clone on write封装成类似于box这样不用标生命周期的智能指针。印象中官方论坛好像也讨论过为什么不用box<str 替代String的方案,但论点是啥给忘了。cow<'_, str 的缺点貌似就是运行时枚举开销和生命周期泛型增加系统复杂度。

fakeshadow 2023-02-10 16:08

大部分http库都用Bytes,actix是抄了httpByteStr的代码,所以没人用

github.com/shanliu/lsys 2023-02-10 15:23

Rc 啥用法?指点下?

--
👇
araraloren: 简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了Rc<str>来规避这个问题.

araraloren 2023-02-10 14:28

简单的库还好,带着生命周期会让有些事情变的巨复杂,所以我直接用了Rc<str>来规避这个问题.

github.com/shanliu/lsys 2023-02-10 11:21

如果是基础的结构体里挂个有带生命周期的字段. 到处传递,有时还当闭包参数,简直不要太酸爽. 整天不干别的就跟编译器都斗争了

Mike Tang 2023-02-10 10:44

一般对于上层业务来讲,清晰性易用性和性能之间,我取前者。

对于底层库级的,取舍又不一样了。

苦瓜小仔 2023-02-10 08:00

cow 最主要的问题是带生命周期泛型,你说好不好用呢🤣

1 共 10 条评论, 1 页