我们知道,Rust中字符串的切片容易会引起panic,千万要注意。主要是,Rust的切片,切的其中字节,这个说法有些抽象,如何能理解呢?

首先,对一个字符串,你认为其字符数和长度是一个什么样的概念?相等,不相等?

比如,对于ascii码字符串,

let same_string ="abc";
println!("chars:{}, length:{}",same_string.chars().count(),same_string.len());// chars :3,length:3

当然,不都是这样的。

let other_string ="忠犬ハチ公";
println!("chars:{}, length:{}",other_string.chars().count(),other_string.len());// chars :5,length:15

所以,最重要的是,Rust的切片,切的是字节,而不是字符。

一、Rust的切片操作

    //Stringlet t1 = "love".to_string();println!("String =>t1:{:?}", &t1[2..]);//必须带&, =>ve// &strlet t2 = "love";println!("&str   =>t2:{:?}", &t2[2..]);//必须带& =>ve

好象看起来,很正常呀,没什么问题的。
如果碰到的全是a…z之类构成的,是可能没问题的,但其它的呢?

二、有没有意外?

既然是危险的操作,危险就是必然的。

// 一个“不正常”的例子let love_china = "忠犬ハチ公";println!("{:?}=>bytes :{:?}", love_china, love_china.bytes().len());//println!("{:?}", love_china.len_utf8());for i in love_china.chars() {println!("{:?} =>bytes :{:?}", i, i.len_utf8());}println!("love_china[0] :{:?}", love_china.chars().nth(0));// 一个正常的例子let normal = "love";println!("=>{:?} =>bytes: {:?}", normal, normal.bytes().len());for i in normal.chars() {println!("{:?}, =>bytes:{:?}", i, i.len_utf8());}println!("normal[0] :{:?}", normal.chars().nth(0).unwrap());

output:

"忠犬ハチ公"=>bytes :15
'忠' =>bytes :3
'犬' =>bytes :3
'ハ' =>bytes :3
'チ' =>bytes :3
'公' =>bytes :3
love_china[0] :Some('忠')
=>"love" =>bytes: 4
'l', =>bytes:1
'o', =>bytes:1
'v', =>bytes:1
'e', =>bytes:1
normal[0] :'l'

发现什么没有?

    println!("love_china len:{:?}", love_china.len());// => len =15,而不是5!

知道问题所在了吧…….

(1) ‘忠’ =>bytes :3.

也就是说,’忠’字符却占3个字节,如果你去切1个字节,还会报什么呢,Rust只能panic了。

let dd1 = &love_china[0..3];//切前3个字节=>'忠'.println!("dd:{:?}", dd);

如果&love_china[0..2]=>切前2个字节,则会panic!.

(2) ‘l’, =>bytes:1。

象“love”其它的每个字符,都只占了1个字节,形成了字符位和字节位的刚好重合,给人一种“安全”的错觉。

三、正确的打开方式

1、单个字符的取值

下面是推荐的取字符串中正确的打开方式:.chars().nth(0)。

    println!("love_china[0] :{:?}", love_china.chars().nth(0));

那如果要取其中的两个字符呢? 思考一下…….

2、多个字符的取值

    let tt = "我爱工作,rust,julia!";let t = tt.chars().into_iter().map(|x| x.to_string()).collect::<Vec<_>>();println!("t:{:?}", t);let ww: String = t[1..3].concat();let qq: String = t[1..3].join("");println!("ww:{:?} qq:{:?}", ww, qq);

Rust : 危险! 关于字符串切片以及取值......相关推荐

  1. Mysql 数据类型(整数、浮点数、定点数、字符串)【类型取值范围】

    整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) 3 ...

  2. java字符串根据分隔符取值_java中解析含分隔符的字符串

    java中解析含分隔符的字符串 (2010-03-24 16:43:58) 标签: 杂谈 字符串的分隔对于一个以某种分隔符标识字段的字符串,如果想得到串中每个字段项,常用的分隔方法能3种. 设args ...

  3. 28. Python 列表的切片取值

    28. 列表的切片取值 文章目录 28. 列表的切片取值 1. 列表的切片 2. 切片的语法 3. 切片取值示例 3.1 步长为1的切片取值 3.2 步长为3的切片取值 3.3 负索引取值 1. 列表 ...

  4. PHP字符串offset取值特性

    在PHP的代码基础上,PHP字符串offset取值特性,可以拿来利用,给PHP应用程序带来安全风险. 在PHP中,可以像操作数组一样操作字符串,字符串中的字符可以用类似数组结构中的方括号包含对应的数字 ...

  5. mysql 截取字符串部分值_mysql截取字符串取值

    使用mysql过程中根据实际业务的开发需求和表的设计有时候我们需要在sql中根据某个字符串截取并且取值:demo如下: ifnull(max(SUBSTRING_INDEX(c.check_score ...

  6. dict取值_Python基础数据类型「list、tuple、dict」

    数组类型 数据类型划分:可变数据类型.不可变数据类型 不可变数据类型:元组, bool, int, str 可哈西 可变数据类型:list, dict, set 不可哈西 字典(dict): key ...

  7. python 根据索引取值_Python基础知识2

    运行Python程序的两种方式 运行Python程序的三步骤(与文本编辑器对比) IDE工具----pycharm 注释 变量 基本数据类型及其内置方法 垃圾回收(GC)机制 基本运算符 流程控制(i ...

  8. Python字符串类型:字符串索引、字符串切片、字符串format()方法格式化、字符串操作符、字符串处理函数

    字符串:由0个或多个字符组成的有序序列sequence. 一.字符串表示方式:2类4种 由一对单引号或双引号表示,该方式仅用于表示单行字符串 由一对三单引号或三双引号,该方式可以表示多行字符串 如果希 ...

  9. python 字符串切片

    1. 字符串的索引 字符串的索引从前往后是从0开始计数,从后往前是从-1开始依次 -1 2.字符串切片方法 语法格式 str[beginIndex:endIndex:step]取值结果: [begin ...

  10. 自动化测试基础(一):字符串的取值、切割、替换、去除、拼接

    一.前言 字符串:在python中用成对的单引号.双引号.三引号括起来的都是字符串,它可以是中文.英文.特殊字符等几乎任何字符. 二.取值 字符串取值用索引,索引从0开始 s='hello!' #元素 ...

最新文章

  1. java 风袖,仓库 - 高谷深陵 (gaogushenling) - Gitee.com
  2. C++ 复数类运算符重载
  3. RabbitMQ延迟消费和重复消费
  4. Cocoa Touch 层
  5. 请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇
  6. 电脑开启上帝模式,300多个系统功能都在这里!
  7. coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
  8. pycharm快捷键之①“上下移动某一行“②参数提示
  9. cryptography安装失败,报gcc错误
  10. GOIP网关所有型号以及分辨方法 对接场景
  11. 在CentOS上安装和配置OpenNebula入门实例
  12. 空气源热泵如何实现远程集中管理的
  13. Flash Switcher(二) - 极致书签管理
  14. 基于环信视频语音通话功能
  15. 今年诺贝尔奖得主居然把这事研究清楚了:学历和收入到底有多大关系?
  16. 树莓派播放音频时3.5mm接口没有声音怎么办?
  17. 提高程序运行速度的方法
  18. sql文字转换全拼_sql汉字转拼音
  19. Java中如何优雅的把Map转为对象
  20. java metronic_基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理...

热门文章

  1. 图解wordpress模板架构
  2. 迷途指针 new delete
  3. Linux硬件硬盘分区知识-总结
  4. 《WF编程》系列之29 - 本地通信事件:HandleExternalEventActivity 活动生成器
  5. 使用Infopath时要注意的有哪些
  6. restfulframework详解
  7. EVE-NG硬盘扩容,存储海量镜像
  8. UNP Chapter 3 - 套接口编程简介
  9. Dynamic Set Up the Web Reference Url To WebService
  10. php基本语法的几点备忘