浅谈切片操作
引言
在很多语言中都有切片这个操作,比如python,rust,go等等,而且大多数都是左闭右开
的索引方式。
以rust为例子,我创建了一个String变量,以及它的两个字符串切片。
在rust中,切片就是对 String 类型中某一部分的引用
fn main()
{
let s = String :: from ("Hello World");
let hello = &s[0..5];
let world = &s[6..11];
println!("{},{}",hello,world);
}
为什么不设计成左闭右闭的呢?
我以前学切片的时候,并不理解这种左闭右开的做法,当时觉得左闭右闭岂不是更加好吗。今天学习了rust切片之后,有了更好的理解。
前面说过,在rust中,切片就是对 String
类型中某一部分的引用
具体的存储方式如下图所示。
如图,字符串切片的存储包含两个部分指针+长度
,而这个长度,正好可以用切片中的[开始索引,结束索引]
直接相减得到,于是就非常方便。
所以,用左闭右开的方式。