|
|
|
@ -88,9 +88,9 @@ let slice = &s[..];
|
|
|
|
|
> println!("{}",a);
|
|
|
|
|
>```
|
|
|
|
|
>因为我们只取`s`字符串的前两个字节,但是一个中文占用三个字节,因此没有落在边界处,也就是连`中`字都取不完整,此时程序会直接崩溃退出,如果改成`&a[0..3]`,则可以正常通过编译.
|
|
|
|
|
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作utf8字符串,参见[这里](#操作UTF8字符串)
|
|
|
|
|
> 因此,当你需要对字符串做切片索引操作时,需要格外小心这一点, 关于该如何操作UTF8字符串,参见[这里](#操作UTF8字符串)
|
|
|
|
|
|
|
|
|
|
字符串切片的类型标识是`&str`,因此我们可以这样申明一个函数,输入`String`类型,返回它的切片: `fn first_word(s: &String) -> &str `.
|
|
|
|
|
字符串切片的类型标识是`&str`,因此我们可以这样声明一个函数,输入`String`类型,返回它的切片: `fn first_word(s: &String) -> &str `.
|
|
|
|
|
|
|
|
|
|
有了切片就可以写出这样的安全代码:
|
|
|
|
|
```rust
|
|
|
|
@ -142,7 +142,7 @@ assert_eq!(slice, &[2, 3]);
|
|
|
|
|
let s = "Hello, world!";
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
实际上,`s`的类型时`&str`,因此你也可以这样声明:
|
|
|
|
|
实际上,`s`的类型是`&str`,因此你也可以这样声明:
|
|
|
|
|
```rust
|
|
|
|
|
let s: &str = "Hello, world!";
|
|
|
|
|
```
|
|
|
|
@ -189,7 +189,7 @@ fn main() {
|
|
|
|
|
// 最后s的内容是"hello,world!"
|
|
|
|
|
assert_eq!(s,"你好,世界!");
|
|
|
|
|
|
|
|
|
|
let s1 = String::from("Hello,");
|
|
|
|
|
let s1 = String::from("hello,");
|
|
|
|
|
let s2 = String::from("world!");
|
|
|
|
|
// 在下句中,s1的所有权被转移走了,因此后面不能再使用s1
|
|
|
|
|
let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used
|
|
|
|
@ -276,7 +276,7 @@ let hello = String::from("中国人");
|
|
|
|
|
```rust
|
|
|
|
|
['न', 'म', 'स', '्', 'त', 'े']
|
|
|
|
|
```
|
|
|
|
|
但是这种形势下,第四和六两个字母根本就不存在,没有任何意义,接着再从字母串的形式去看:
|
|
|
|
|
但是这种形式下,第四和六两个字母根本就不存在,没有任何意义,接着再从字母串的形式去看:
|
|
|
|
|
```rust
|
|
|
|
|
["न", "म", "स्", "ते"]
|
|
|
|
|
```
|
|
|
|
|