- 主题:rust新手问一下
你自己注释不都写了for val in vals { // vals moved,
【 在 txgx 的大作中提到: 】
: 再问一个问题, 这个怎么搞 ?
: 只是想 print vals 长度而已 , 编译不了
:
: ...................
--
FROM 123.116.212.*
你想要的是不是这个
for val in &vals { // vals moved,
tx.send(val.clone()).unwrap();
println!("Len in vec {:?}", vals.len()); // so invalide here!!
thread::sleep(Duration::from_secs(1));
}
一个只看过15分钟rust的程序员胡猜的
【 在 leadu 的大作中提到: 】
: 你自己注释不都写了for val in vals { // vals moved,
:
--
FROM 123.116.212.*
这样子也不行,牵扯到channel, 异至&vals有生命周期问题。
error[E0597]: `vals` does not live long enough
--> src/main.rs:15:20
|
6 | let (tx, rx) = mpsc::channel();
| -- lifetime `'1` appears in the type of `tx`
...
15 | for val in &vals {
| ^^^^^ borrowed value does not live long enough
16 | tx.send(val).unwrap();
| ------------ argument requires that `vals` is borrowed for `'1`
...
20 | });
| - `vals` dropped here while still borrowed
error: aborting due to previous error
For more information about this error, try `rustc --explain E0597`.
error: could not compile `test-vec`
就是要在 中间 !!
【 在 leadu 的大作中提到: 】
: 你想要的是不是这个
:
: for val in &vals { // vals moved,
: tx.send(val.clone()).unwrap();
: println!("Len in vec {:?}", vals.len()); // so invalide her
: ..................
发自「今日水木 on MRX-W29」
--
修改:txgx FROM 42.234.93.*
FROM 42.234.93.*
在不少的编程语言中 for val in vals {
是只读的,长度的话提前取一下就行
【 在 txgx 的大作中提到: 】
: 这样子也不行,牵扯到channel, 异至&vals有生命周期问题。
: 发自「今日水木 on MRX-W29」
--
FROM 123.116.212.*
就是要在中间,搞不懂为啥有生命周期问题。
val这个时候是&string, tx.send 为啥不行呢?
应该是发送完了才退出,这时候vals不是一直有效吗?
【 在 leadu 的大作中提到: 】
: 在不少的编程语言中 for val in vals {
: 是只读的,长度的话提前取一下就行
: --
发自「今日水木 on MRX-W29」
--
FROM 42.234.93.*
你想想send掉一个元素之后,vals里面有一个位置没有元素,是什么状态?
显然不可能是合法状态。就像你注释写的一样,vals已经被消费掉了,不能再访问了。
1. 你把对vals的访问移到for前面。
2. 像楼上说的,不要直接send元素,clone:
for val in &vals {
tx.send(val.clone()).unwrap();
或者
for val in vals.iter() {
tx.send(val.clone()).unwrap();
【 在 txgx 的大作中提到: 】
: 再问一个问题, 这个怎么搞 ?
: 只是想 print vals 长度而已 , 编译不了
:
: ...................
--
FROM 58.37.58.*
所以打印vals.len()其实没用,一直都是4
要在for的里面引用vals,就不能让for一开始把vals给move走了,
但是不move走的话,只是ref或者clone的话,vals.len()就会不变,就不需要在for的里面打印。
for val in vals这句为啥会把vals给move走,这里有解释:
https://stackoverflow.com/questions/59123462/why-is-iterating-over-a-collection-via-for-loop-considered-a-move-in-rust
这里还提到如果vals是一个range而非vec的话,需要用&mut,而不是&
https://users.rust-lang.org/t/move-into-for-loop/41339/2
【 在 ilovecpp 的大作中提到: 】
: 你想想send掉一个元素之后,vals里面有一个位置没有元素,是什么状态?
: 显然不可能是合法状态。就像你注释写的一样,vals已经被消费掉了,不能再访问了。
: 1. 你把对vals的访问移到for前面。
: ...................
--
修改:z16166 FROM 114.241.227.*
FROM 114.241.227.*
综合15楼的分析,有一点可以肯定
for v in vals 把vector 清空了!
如果println可以工作的话,那么输出应该是4,3,2,1,0
这太令人窒息了!我只是想看一眼,结果人家流产了!
这到哪里说理去?!
最关键的是let vals = vec![] 用的immutable !!!!
rust 不给一个解释吗?自己都不遵守规则了?
婶可忍,叔不可忍!!!
【 在 z16166 的大作中提到: 】
: 所以打印vals.len()其实没用,一直都是4
:
: 要在for的里面引用vals,就不能让for一开始把vals给move走了,
: 但是不move走的话,只是ref或者clone的话,vals.len()就会不变,就不需要在for的里面打印。
:
: for val in
: ..................
发自「今日水木 on MRX-W29」
--
FROM 42.234.93.*
for val in vals这句是可以单步跟进去到std内部的源代码的,调用的Vec<T>::into_iter(),
for val in vals也就是for val in vals.into_iter(),
里面会调用std::mem::forget(self)转移ownership。
是整体转移,不是逐个减少vals中的元素个数。


【 在 txgx 的大作中提到: 】
: 综合15楼的分析,有一点可以肯定
: for v in vals 把vector 清空了!
: 如果println可以工作的话,那么输出应该是4,3,2,1,0
: ...................
--
FROM 123.115.133.*
还是你牛。
不过看函数原型用的是mut self 怎么回事?
【 在 txgx 的大作中提到: 】
: use tokio::task::yield_now;
: use std::rc::Rc;
:
: #\[tokio::main\]
: async fn main() {
: tokio::spawn(async {
: let rc = Rc::new("he
: ..................
发自「今日水木 on MRX-W29」
--
修改:txgx FROM 42.234.93.*
FROM 42.234.93.*