ZhangHanDong / tao-of-rust-codes

《Rust编程之道》随书源码
https://ruststudy.github.io/tao_of_rust_docs/tao_of_rust/
MIT License
1.19k stars 172 forks source link

2.3.3所有权与借用 代码清单2-5 对于“移动”的说明太过模糊 #281

Closed limuyuan closed 4 years ago

limuyuan commented 4 years ago

页码与行数


代码

具体代码请点击[Rust Playground代码链接](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&code=fn%20main()%20%7B%0A%20%20%20%20%2F%2Flet%20place1%20%3D%20%22hello%22%3B%0A%20%20%20%20let%20place2%20%3D%20%22hello%22.to_string()%3B%0A%20%20%20%2F%2F%20let%20other%20%3D%20place1%3B%0A%2F%2Fprintln!(%22%7B%3A%3F%7D%22%2C%20place1)%3B%0A%20%20%20%20let%20other%20%3D%20place2%3B%0A%20%20%20%20println!(%22%7B%3A%3F%7D%22%2C%20place2)%3B%0A%7D)查看

错误信息

error[E0382]: borrow of moved value: `place2`
 --> src/main.rs:7:22
  |
3 |     let place2 = "hello".to_string();
  |         ------ move occurs because `place2` has type `std::string::String`, which does not implement the `Copy` trait
...
6 |     let other = place2;
  |                 ------ value moved here
7 |     println!("{:?}", place2);
  |                      ^^^^^^ value borrowed here after move

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.
error: could not compile `playground`.

To learn more, run the command again with --verbose.

之前完全没有接触过Rust,这本书前面大概能看得懂,代码清单2-5这里是我第一个看得一头雾水的地方

开始我还以为“移动”是指other的值从place1变成place2导致的,直到我用了playground跑出来,看编译器的输出,才发现跟place1根本没关系,重点在place2to_string()上面,可是书中完全没有提到这个,只说“移动”语义,是不是有点太模糊了?

limuyuan commented 4 years ago
ZhangHanDong commented 4 years ago

@limuyuan 感谢反馈。 不过我建议你继续往后面看,第二章只是一个简单的语法梳理,后面会有更详细的解释。写书当然是循序渐进的了,不可能在这个例子下详细解释所有权,那样的话,第二章的内容就要被“撑大”了。

limuyuan commented 4 years ago

@limuyuan 感谢反馈。 不过我建议你继续往后面看,第二章只是一个简单的语法梳理,后面会有更详细的解释。写书当然是循序渐进的了,不可能在这个例子下详细解释所有权,那样的话,第二章的内容就要被“撑大”了。

不是说让你详细说明,起码提一下to_string()吧?代码示例是为你要介绍的知识点服务的,而不是起到烟雾弹的效果,直接丢出去一堆代码然后说会报错,然后报错的点在哪里都不说。。

limuyuan commented 4 years ago

我只是作为初学者的角度来提出我的疑问和建议,不被采纳没关系,不过我还是希望你可以理解一下为什么我会对此感到非常困惑。就算后面会讲到,但是前面如果不直接一针见血提到to_string(),我甚至不知道后面我需要进一步了解的是哪块内容。要是什么都可以用“后面会学到”来回复的话,其实我建议您可以删掉整个第二章。

ZhangHanDong commented 4 years ago

@limuyuan 很感谢你的反馈。我会采纳你的意见的。

ZhangHanDong commented 4 years ago

@limuyuan 但是目前建议你继续往后面看了。 另外有任何问题都可以发 issues 反馈,我很欢迎的,不用顾虑。

ZhangHanDong commented 4 years ago

@limuyuan 扫描书封面内页二维码,可以加读者微信群,交流更方便

limuyuan commented 4 years ago

@limuyuan 但是目前建议你继续往后面看了。 另外有任何问题都可以发 issues 反馈,我很欢迎的,不用顾虑。

好的,感谢回复

我后面是通过自己用Playground才大概弄清楚问题在哪里,所以希望反馈一下把这个点加到书中,让初学者可以少些误解少走一点点弯路,我会继续看下去的

ZhangHanDong commented 4 years ago

@limuyuan 嗯,看的过程中有什么建议和问题,都欢迎留言。

limuyuan commented 4 years ago

果然还是要先看The Rust Programming Language....我是万万没想到原来移动是这么玩的

原来跟to_string()也是一毛钱关系没有啊。。

limuyuan commented 4 years ago

果然还是要先看The Rust Programming Language....我是万万没想到原来移动是这么玩的

原来跟to_string()也是一毛钱关系没有啊。。

又看了一下书上的例子,还是有关系的。。 "hello"是字面字符串,是存放在stack里面的,而"hello".to_string()是字符串类型?存放在heap里面,所以会发生Move?

ZhangHanDong commented 4 years ago

@limuyuan 你继续往后面看,不要停留在第二章,就会自己发现答案。