2.6 Rust Slice Type
字符串操作
fn first_word(s: &String) -> usize {
let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
} s.len()
}
Because we need to go through the String
element by element and check whether a value is a space, we’ll convert our String
to an array of bytes using the as_bytes
method
For now, know that iter
is a method that returns each element in a collection and that enumerate
wraps the result of iter
and returns each element as part of a tuple instead. The first element of the tuple returned from enumerate
is the index, and the second element is a reference to the element. This is a bit more convenient than calculating the index ourselves.
Because the enumerate
method returns a tuple, we can use patterns to destructure that tuple, just like everywhere else in Rust. So in the for
loop, we specify a pattern that has i
for the index in the tuple and &item
for the single byte in the tuple. Because we get a reference to the element from .iter().enumerate()
, we use &
in the pattern.
Inside the for
loop, we search for the byte that represents the space by using the byte literal syntax. If we find a space, we return the position. Otherwise, we return the length of the string by using s.len()
fn main() {
let mut s = String::from("hello world"); let _word = first_word(&s); // word will get the value 5 println!("{},{}",s,_word);
s.clear(); // this empties the String, making it equal to "" // word still has the value 5 here, but there's no more string that
// we could meaningfully use the value 5 with. word is now totally invalid!
} fn first_word(s: &String) -> usize {
let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
} s.len()
}
字符串切片
str[index..end_position]
index:字符索引位置,从0开始
end_position:字符位置,从1开始
let s = String::from("hello world"); let hello = &s[..];
let world = &s[..];
With Rust’s ..
range syntax, if you want to start at the first index (zero), you can drop the value before the two periods. In other words, these are equal:
let s = String::from("hello"); let slice = &s[..];
let slice = &s[..];
By the same token, if your slice includes the last byte of the String
, you can drop the trailing number. That means these are equal:
let s = String::from("hello"); let len = s.len(); let slice = &s[..len];
let slice = &s[..];
You can also drop both values to take a slice of the entire string. So these are equal:
let s = String::from("hello"); let len = s.len(); let slice = &s[..len];
let slice = &s[..];
Note: String slice range indices must occur at valid UTF-8 character boundaries. If you attempt to create a string slice in the middle of a multibyte character, your program will exit with an error.
切片字符串操作
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
} &s[..]
}
第一种方式为直接对字符串本身进行操作,没有第二个变量产生,切片则是新定义了一个变量,指向了原字符串的部分内容。当作用域发生变化时,它们的不同就会显现出来。
下面这一段代码是正确的
fn main() {
let mut s = String::from("hello world"); let word = first_word(&s); s.clear(); // error! println!("the first word is: {}", word);
} fn first_word(s: &String) -> usize {
let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return i;
}
} s.len()
}
然而官网上则说这段代码是有问题的,可能是rust版本升级后此处做了改动
fn main() {
let my_string = String::from("hello world"); // first_word works on slices of `String`s
let word = first_word(&my_string); //let my_string_literal = "hello world"; // first_word works on slices of string literals
//let word = first_word(&my_string_literal); // Because string literals *are* string slices already,
// this works too, without the slice syntax!
//let word = first_word(my_string_literal);
println!("{}",word);
} fn first_word(s: &String) -> &str {
let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[..i];
}
} &s[..]
}
2.6 Rust Slice Type的更多相关文章
- 深度解密Go语言之Slice
目录 当我们在说 slice 时,到底在说什么 slice 的创建 直接声明 字面量 make 截取 slice 和数组的区别在哪 append 到底做了什么 为什么 nil slice 可以直接 a ...
- golang 数组以及slice切片
老虞学GoLang笔记-数组和切片 数组 Arrays 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值.在初始化后长度是固定的,无法修改其 ...
- go基础之基本数据结构(数组、slice、map)
go基本的数据结构有数组.slice.map,高级数据结构为结构体为用户自定义类型.本片文章主要讲解三大基本数据结构. 数组 slice Map 数组 数组是包含单个类型的元素序列,但是长度固定的数据 ...
- golang ----array and slice
Go Slices: usage and internals Introduction Go's slice type provides a convenient and efficient mean ...
- egg源码浅析一npm init egg --type=simple
要egg文档最开始的时候,有这样的几条命令: 我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目: $ mkdir egg-example && cd egg-example ...
- slice使用了解
切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 什么是slice Go中的切片,是 ...
- Go - 内置函数大全
Package builtin import "builtin" Overview Index Overview ▾ Package builtin provides docume ...
- 深入学习golang(3)—类型方法
类型方法 1. 给类型定义方法 在Go语言中,我们可以给任何类型(包括内置类型,但不包括指针和接口)定义方法.例如,在实际编程中,我们经常使用[ ]byte的切片,我们可以定义一个新的类型: type ...
- golang的"..."备忘
1. 用于数组: 表示长度与元素个数相同. 在golang中数组的长度是类型的一部分,不同长度,不同类型. 2. 用于参数: 用于形参表示可变参数. 用于实参表示直接传递. 具体解释参数见官方文档: ...
随机推荐
- 用kettle实现数据库迁移之oracle到mysql
项目完成后,需要把历史oracle 的数据库转移mysql 用kettle 转换数据. 步骤: 1.打开spoon.bat,文件-->新建-->转换,点击“主对象树”,DB连接右键“新建” ...
- HttpContext.Current.Session[strName]未将对象引用设置到对象的实例
项目开发是在4.5.1上,不知道为啥客户提供的服务器上安装的是4.5,差别不大也没去升级,然后部署MVC的时候web.config报错 <system.web> <compilati ...
- SIP简介
说明:以下内容来着之前下载的一份文档,现将概念部分摘录在BLog,如需要完整文档将放在文件中或留言. SIP简介,第1部分:SIP初探 时间:2006-04-07作者:Emmanuel Proulx浏 ...
- myeclipse便捷导包方式
1.将spring框架的core导成如图的方式 2.选中项目右键--bulid path--进入buildpath 3.选择add library 4.选择user library 5.选择user ...
- 浅说Java反射机制
工作中遇到,问题解决: JAVA语言中的反射机制: 在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法? 对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的 ...
- 简单引入logback
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...
- ORB_SLAM2_Android
链接:https://github.com/FangGet/ORB_SLAM2_Android README.md 说明文件 This Project is out of date 该工程过时了 Th ...
- linux安装x264 ffmpeg
1. 安装yasm 2. 安装x264 3. 安装ffmpeg 安装网上很多例子,以下是我主要参考的两篇博客: http://www.cnblogs.com/lidabo/p/3987378.html ...
- 【重要】拷贝NIOS II工程后,修改工程前必须要做的10件事
1.拷贝现有工程到新的目录2.打开Quartus II工程文件3.打开NIOS II EDS软件4.切换工作空间到当前的新工程根目录5.在NIOS II EDS软件中将已有的软件工程先删除掉(不要勾选 ...
- 桂林理工大学第十届java程序设计初试竞赛试题
原创 三.程序设计题(不得改变已经给出的部分,允许添加新的辅助函数或类)(共36分) (6分)1.以下函数的功能是判断一个正整数是否为质数,若是返回true,否则返回false.其中参数data为要判 ...