Merge pull request #156 from chenxuuu/main

更正一些错误
pull/158/head
Sunface 3 years ago committed by GitHub
commit ac66d87239
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -88,9 +88,9 @@ let slice = &s[..];
> println!("{}",a); > println!("{}",a);
>``` >```
>因为我们只取`s`字符串的前两个字节,但是一个中文占用三个字节,因此没有落在边界处,也就是连`中`字都取不完整,此时程序会直接崩溃退出,如果改成`&a[0..3]`,则可以正常通过编译. >因为我们只取`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 ```rust
@ -142,7 +142,7 @@ assert_eq!(slice, &[2, 3]);
let s = "Hello, world!"; let s = "Hello, world!";
``` ```
实际上,`s`的类型`&str`,因此你也可以这样声明: 实际上,`s`的类型`&str`,因此你也可以这样声明:
```rust ```rust
let s: &str = "Hello, world!"; let s: &str = "Hello, world!";
``` ```
@ -189,7 +189,7 @@ fn main() {
// 最后s的内容是"hello,world!" // 最后s的内容是"hello,world!"
assert_eq!(s,"你好,世界!"); assert_eq!(s,"你好,世界!");
let s1 = String::from("Hello,"); let s1 = String::from("hello,");
let s2 = String::from("world!"); let s2 = String::from("world!");
// 在下句中s1的所有权被转移走了因此后面不能再使用s1 // 在下句中s1的所有权被转移走了因此后面不能再使用s1
let s3 = s1 + &s2; // note s1 has been moved here and can no longer be used 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
['न', 'म', 'स', '्', 'त', 'े'] ['न', 'म', 'स', '्', 'त', 'े']
``` ```
但是这种形下,第四和六两个字母根本就不存在,没有任何意义,接着再从字母串的形式去看: 但是这种形下,第四和六两个字母根本就不存在,没有任何意义,接着再从字母串的形式去看:
```rust ```rust
["न", "म", "स्", "ते"] ["न", "म", "स्", "ते"]
``` ```

@ -110,24 +110,30 @@ fn build_user(email: String, username: String) -> User {
> 值的注意的是:`username`所有权被转移给了`user2`,导致了`user1`无法再被使用,但是并不代表`user1`内部的其它字段不能被继续使用,例如: > 值的注意的是:`username`所有权被转移给了`user2`,导致了`user1`无法再被使用,但是并不代表`user1`内部的其它字段不能被继续使用,例如:
```rust ```rust
let user1 = User { # #[derive(Debug)]
email: String::from("someone@example.com"), # struct User {
username: String::from("someusername123"), # active: bool,
active: true, # username: String,
sign_in_count: 1, # email: String,
}; # sign_in_count: u64,
# }
let user2 = User { # fn main() {
active: user1.active, let user1 = User {
username: user1.username, email: String::from("someone@example.com"),
email: String::from("another@example.com"), username: String::from("someusername123"),
sign_in_count: user1.sign_in_count, active: true,
}; sign_in_count: 1,
};
println!("{}", user1.active); let user2 = User {
active: user1.active,
// 下面这行会报错 username: user1.username,
//println!("{}", user1); email: String::from("another@example.com"),
sign_in_count: user1.sign_in_count,
};
println!("{}", user1.active);
// 下面这行会报错
println!("{:?}", user1);
# }
``` ```
## 结构体的内存排列 ## 结构体的内存排列
@ -246,4 +252,4 @@ help: consider introducing a named lifetime parameter
``` ```
未来在[生命周期](../../advance/lifetime/basic.md)中会讲到如何修复这个问题以便在结构体中存储引用,不过在那之前,我们会避免在结构体中使用引用类型。 未来在[生命周期](../../advance/lifetime/basic.md)中会讲到如何修复这个问题以便在结构体中存储引用,不过在那之前,我们会避免在结构体中使用引用类型。

Loading…
Cancel
Save