rust学习九.2、集合之字符串
按照作者的意思,字符串不是看起来那么简单!
的确,字符串在大部分语言中,都不是看起来那么简单!
字符串的内容看起来很多,又很少!
多是因为涉及到编码、构成、方法(有许多方法)还有字符串切片。
少是因为,其实和java等语言其实没有大的区别。
一、构成
rust的字符串内部是 vec(u8)+方法,看起来和java其实区别不大,至少在逻辑层面,大家差不多!
rust.String定义
java.String定义(jdk17,摘选)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence, Constable, ConstantDesc { @Stable private final byte[] value; }
没有太多本质的区别,大家都有数组存储实际的值,不同的是java存储的是字节数组,而rust存储的u8数组。
这都是表面的,其实都是一个字节数组。
如果用的是rustOver,那么查看源码还是比较方便的,操作方式和eclipse,idea一样,ctrl+点击鼠标左键。
如上图,点击红色矩形中的String,即可跳转到String.rs
二、示例
上例中,使用字符串切片,这个其实和字符串没有本质的区别,因为前者是对字符串的局部引用。
上例中,演示了企图通过索引/或者切片的方式访问多字节utf-8字符的部分数据时发生错误的情形。
这种情况下,会给出足够好友的提示! 这也是rustc的一大优点。
根据这个提示,如果把上文的代码改为:
println!("{}的第一个字符是:{}",cn,&cn[0..3]);
那么还是可以正确执行的!
需要逐个打印字符串的每个字符,可以使用以下方式:
let cn:String="中华人民共和国".to_string();
println!("cn的包含了以下几个汉字:");
for c in cn.chars(){
println!("{}",c);
}
三、小结
才看了个头,不敢说对String有什么深入了解,所以就说一些基本的:
- rust的String和其它语言(java)并没有大的区别
- 注意rust使用utf-8来存储字符的,无法指定其它字符集。如果要达到那个目的,只能另寻他途
- 采用utf-8对于GBK编码的并不友好,无疑多少要会浪费一些空间和性能.如果是java就十分方便,只要指定GBK编码即可.