Rust入门系列之SliceSlice是Rust中提供的一种非所有权数据类型,它是对某种类型(String、Array...)的特定位置的引用。在Rust中,字符串的字面值是一个slice类型,是对二进制程序特定位置值的引用,是不可变引用。切片类型的符号用&str表示。接下来我们看一下如何创建切片//1.使用Letslice="haha";//2.使用range对String进行切片lets=String::from("helloworld");letsclice_s=&s[0..5];//"hello"//如果是从头到尾切片,可以简写letsclice_s_all=&s[..];//“helloworld”为什么要用切片对于初学者,你可能会有这样一个疑问,为什么要用切片,用切片解决什么问题?要了解这些问题,首先要了解一些应用场景,以便于后续分析。假设现在我们要设计这样一个函数,它的作用是提取字符串中第一个空格之前的所有字符,如果没有空格则返回整个字符串,比如(“helloworld”提取“hello”),但是现在我们不能使用切片,只能考虑获取关键位置的索引匹配字符串中出现的第一个空格,返回其索引如果没有匹配到空格,则返回字符串的长度接下来我们看Rust的实现fnmain(){letstr=String::from("helloworld");让index=get_space_index(&str);println!("索引为{}",index);//索引为5}fnget_space_index(s:&String)->usize{//将字符串转换为字符数组letarr=s.as_bytes();for(i,&item)inarr.iter().enumerate(){ifitem==b''{返回i;}}s.len()}上面的例子可以获取到第一个空间的索引,后面我们也可以使用这个索引来满足需求,但是这个方法的问题是我们获取的索引不是强关联的字符串,如果我们在使用索引之前不小心修改了目标字符串,那么索引就会失去意义。基于以上问题,我们应该使用切片与目标字符串建立强关联,利用切片是不可变引用的特点,让Rust编译器帮我们检查修改目标字符串值的不合理操作,通过mutablereferences(这里有疑问的同学可以看我之前的分享-《03-引用与借用》)接下来我们使用切片实现初始需求fnmain(){letstr=String::from("helloworld");让first_word=slice_first_word(&str[..]);println!("{}",first_word);//hello}fnslice_first_word(s:&str)->&str{//将字符串转换为字符数组letarr=s.as_bytes();for(i,&item)inarr.iter().enumerate(){//判断当前位是否为空格ifitem==b''{return&s[..i];}}&s[..]}其他数据类型的切片数组letarr=[1,2,3,4,5];letslice=&arr[1..3];println!("{:?}",切片);//[2,3]
