主要观点:字符串对所有程序员都很重要,对生物信息学家更是如此。文中比较了 Rust 和 Julia 中字符串的设计,包括不可变性、结构体定义、索引、访问底层字节、UTF8 编码处理、字符串 API 等方面,并探讨了各自的优缺点。
关键信息:
- Rust 中
String
结构体由Vec<u8>
存储 UTF8 编码内容,str
是字符串视图,有多种字符串类型且需复制为拥有和借用版本;Julia 中String
由长度、UTF8 数据和末尾空字节组成,通过单指针在堆上传递,所有字符串方法为普通函数。 - Rust 和 Julia 都可切片获取子字符串,Julia 可通过标量索引获取
Char
,Rust 不允许整数索引。访问字符串底层字节,Rust 用as_bytes
返回&[u8]
,Julia 用codeunits
返回CodeUnits{UInt8, String}
。 - Rust 字符串始终为有效 UTF8,创建无效 UTF8 字符串会在运行时 panic;Julia 允许无效 UTF8 字符串,用户可选择处理或忽略。
- Rust 字符串 API 出色,一致使用
&(mut) str
,有专门的 ASCII 函数等;Julia 字符串 API 在逐渐改进,近年已添加一些新功能。
重要细节: - Julia 中字符串不可变,修改需用不安全函数,其内部通过特殊模式处理可变性以避免未定义行为;Rust 中变量可变或不可变,
String
可通过可变变量或引用修改且支持动态扩容。 - 对于处理字符串的程序,有些对输入结构不敏感,如
cat
等,UTF8 验证反而是多余的;有些处理结构化数据的程序有更严格要求,UTF8 验证不能满足。 - 关于
cut
工具,仅验证 UTF8 是不够的,还需验证文件格式;对于一些操作在错误 UTF8 字符串上的结果,可根据规则决定是否有意义。 - Rust 强制有效 UTF8 可促使程序员考虑非 UTF8 数据,或满足要求字符串必须为 UTF8 的库;Julia 更倾向于“UTF8 按约定”的方式,默认能处理其他编码。
- Julia 部分字符串功能在逐渐追赶 Rust,如添加非分配分割器等。
- Julia 不完全自托管,编译器在底层非 Julia 语言,这导致其字符串设计有一定特殊性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。