Rust : 危险! 关于字符串切片以及取值......
我们知道,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 : 危险! 关于字符串切片以及取值......相关推荐
- Mysql 数据类型(整数、浮点数、定点数、字符串)【类型取值范围】
整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节 范围(-128~127) smallint(m) 2个字节 范围(-32768~32767) mediumint(m) 3 ...
- java字符串根据分隔符取值_java中解析含分隔符的字符串
java中解析含分隔符的字符串 (2010-03-24 16:43:58) 标签: 杂谈 字符串的分隔对于一个以某种分隔符标识字段的字符串,如果想得到串中每个字段项,常用的分隔方法能3种. 设args ...
- 28. Python 列表的切片取值
28. 列表的切片取值 文章目录 28. 列表的切片取值 1. 列表的切片 2. 切片的语法 3. 切片取值示例 3.1 步长为1的切片取值 3.2 步长为3的切片取值 3.3 负索引取值 1. 列表 ...
- PHP字符串offset取值特性
在PHP的代码基础上,PHP字符串offset取值特性,可以拿来利用,给PHP应用程序带来安全风险. 在PHP中,可以像操作数组一样操作字符串,字符串中的字符可以用类似数组结构中的方括号包含对应的数字 ...
- mysql 截取字符串部分值_mysql截取字符串取值
使用mysql过程中根据实际业务的开发需求和表的设计有时候我们需要在sql中根据某个字符串截取并且取值:demo如下: ifnull(max(SUBSTRING_INDEX(c.check_score ...
- dict取值_Python基础数据类型「list、tuple、dict」
数组类型 数据类型划分:可变数据类型.不可变数据类型 不可变数据类型:元组, bool, int, str 可哈西 可变数据类型:list, dict, set 不可哈西 字典(dict): key ...
- python 根据索引取值_Python基础知识2
运行Python程序的两种方式 运行Python程序的三步骤(与文本编辑器对比) IDE工具----pycharm 注释 变量 基本数据类型及其内置方法 垃圾回收(GC)机制 基本运算符 流程控制(i ...
- Python字符串类型:字符串索引、字符串切片、字符串format()方法格式化、字符串操作符、字符串处理函数
字符串:由0个或多个字符组成的有序序列sequence. 一.字符串表示方式:2类4种 由一对单引号或双引号表示,该方式仅用于表示单行字符串 由一对三单引号或三双引号,该方式可以表示多行字符串 如果希 ...
- python 字符串切片
1. 字符串的索引 字符串的索引从前往后是从0开始计数,从后往前是从-1开始依次 -1 2.字符串切片方法 语法格式 str[beginIndex:endIndex:step]取值结果: [begin ...
- 自动化测试基础(一):字符串的取值、切割、替换、去除、拼接
一.前言 字符串:在python中用成对的单引号.双引号.三引号括起来的都是字符串,它可以是中文.英文.特殊字符等几乎任何字符. 二.取值 字符串取值用索引,索引从0开始 s='hello!' #元素 ...
最新文章
- java 风袖,仓库 - 高谷深陵 (gaogushenling) - Gitee.com
- C++ 复数类运算符重载
- RabbitMQ延迟消费和重复消费
- Cocoa Touch 层
- 请写出3个Android布局,一起撸一波干货集中营练练手Android(三)布局+实现篇
- 电脑开启上帝模式,300多个系统功能都在这里!
- coreseek mysql.sock_Coreseek + Sphinx + Mysql + PHP构建中文检索引擎
- pycharm快捷键之①“上下移动某一行“②参数提示
- cryptography安装失败,报gcc错误
- GOIP网关所有型号以及分辨方法 对接场景
- 在CentOS上安装和配置OpenNebula入门实例
- 空气源热泵如何实现远程集中管理的
- Flash Switcher(二) - 极致书签管理
- 基于环信视频语音通话功能
- 今年诺贝尔奖得主居然把这事研究清楚了:学历和收入到底有多大关系?
- 树莓派播放音频时3.5mm接口没有声音怎么办?
- 提高程序运行速度的方法
- sql文字转换全拼_sql汉字转拼音
- Java中如何优雅的把Map转为对象
- java metronic_基于BootStrap Metronic开发框架经验小结【一】框架总览及菜单模块的处理...