- 主题:rust新手问一下
self的ownership发生了转移,所以是mut self。
可以改用for val in vals.iter()这个,iter()是ref,不是mut ref,这样for循环里面可以继续使用vals。
"Rust 中的集合(Collection)提供三个公共方法创建迭代器:iter()、iter_mut() 和 into_iter(),分别用于迭代 &T(引用)、&mut T(可变引用)和 T(值)。其中,前两种是普通方法,而into_iter() 来自于 IntoIterator trait。Rust 的 for 循环其实是迭代器语法糖,当没有显式的使用迭代器时,它会根据不同的上下文,分别使用 T、&T 和 &mut T 类型所实现的 into_iter() 返回的迭代器。唯一的例外是数组,原因是数组不能丢弃它的元素(不能缩小),因此 [T; N] 类型无法实现 into_iter(),只有 &[T; N] 和 &mut [T; N] 类型实现了 into_iter()。"
https://zhuanlan.zhihu.com/p/76293615
--
修改:z16166 FROM 123.115.133.*
FROM 123.115.133.*
这个理解不对。Vec的into_iter不是通过“丢弃它的元素(缩小)”实现的。IntoIter拿走了原Vec的整个buffer,原Vec在into_iter之后直接消失。
数组没有into_iter只是rust编译器的技术限制,没有什么原理上的困难。相关代码上个月刚刚加入,rust下个版本里数组应该可以直接for in了。
【 在 z16166 的大作中提到: 】
: self的ownership发生了转移,所以是mut self。
: 可以改用for val in vals.iter()这个,iter()是ref,不是mut ref,这样for循环里面可以继续使用vals。
: "Rust 中的集合(Collection)提供三个公共方法创建迭代器:iter()、iter_mut() 和 into_iter(),分别用于迭代 &T(引用)、&mut T(可变引用)和 T(值)。其中,前两种是普通方法,而into_iter() 来自于 IntoIterator trait。Rust 的 for 循环其实是迭代器语法糖,当没有显式的使用迭代器时,它会根据不同的上下文,分别使用 T、&T 和 &mut T 类型所实现的 into_iter() 返回的迭代器。唯一的例外是数组,原因是数组不能丢弃它的元素(不能缩小),因此 [T; N] 类型无法实现 into_iter(),只有 &[T; N] 和 &mut [T; N] 类型实现了 into_iter()。"
: ...................
--
修改:ilovecpp FROM 58.37.58.*
FROM 58.37.58.*
数组的那点确实不对
搜了一下讨论,
数组的IntoIterator的一个方案是基于impl Trait的,一个是基于const generics的
不知道最后选的哪个
https://github.com/rust-lang/rust/pull/32871
https://github.com/rust-lang/rust/issues/25725
https://github.com/rust-lang/rust/pull/65819
【 在 ilovecpp 的大作中提到: 】
: 这个理解不对。Vec的into_iter不是通过“丢弃它的元素(缩小)”实现的。IntoIter拿走了原Vec的整个buffer,原Vec在into_iter之后直接消失。
: 数组没有into_iter只是rust编译器的技术限制,没有什么原理上的困难。相关代码上个月刚刚加入,rust下个版本里数组应该可以直接for in了。
--
FROM 123.115.133.*
self的ownership发生了转移,所以是mut self。
这个怎么理解,哪本书里面有解释?
【 在 z16166 的大作中提到: 】
: self的ownership发生了转移,所以是mut self。
:
: 可以改用for val in vals.iter()这个,iter()是ref,不是mut ref,这样for循环里面可以继续使用vals。
:
: "Rust 中的集合(Collection)提供三个公共方法
: ..................
发自「今日水木 on MRX-W29」
--
FROM 42.234.93.*
简直要吐血!
fn fun(mut vec:Vec<i32>){
vec.push(3);
}
fn fun1(vec:Vec<i32>){
let mut vec=vec;//可以重新绑定到一个mut vec上,说白了上面那种就是这种的语法糖
vec.push(3);
}
self 被 move 进这个函数后所有权就被转移了,到时候尽可自由地把它改成可变的。
【 在 txgx 的大作中提到: 】
: self的ownership发生了转移,所以是mut self。
:
: 这个怎么理解,哪本书里面有解释?
:
: 发自「今日水木 on MRX-W29」
: --
: 旦起欲专言善事,不欲先计较钱财
: 清旦常言善事,勿恶言
: 善言勿离口,乱想勿经心
: 勿言
: ..................
发自「今日水木 on MRX-W29」
--
FROM 42.234.93.*
用11楼的方法,导致12楼的问题, 应该怎么解决?
@z16166 @ilovecpp
15楼的方式的确能解决问题,但是为嘛用引用会有生命周期问题?
【 在 txgx 的大作中提到: 】
: 简直要吐血!
: fn fun(mut vec:Vec<i32>){
: vec.push(3);
: ...................
--
修改:txgx FROM 115.52.185.*
FROM 115.52.185.*
我也在借着你的问题学习。
如果只是传递self,self被move到into_iter()中,并且self的成员是只读的。
fn into_iter(self)
如果在into_iter()内还需要修改self的成员,那就需要加上mut。
fn into_iter(mut self)
这个地方讲解了一下mut self。
https://users.rust-lang.org/t/what-is-different-between-mut-self-and-mut-self/59708/2
【 在 txgx 的大作中提到: 】
: self的ownership发生了转移,所以是mut self。
: 这个怎么理解,哪本书里面有解释?
: 发自「今日水木 on MRX-W29」
--
FROM 123.115.133.*
你在12楼抄我代码抄少了一个clone,抄全了就是正确的
【 在 txgx 的大作中提到: 】
: 用11楼的方法,导致12楼的问题, 应该怎么解决?
: @z16166 @ilovecpp
: 15楼的方式的确能解决问题,但是为嘛用引用会有生命周期问题?
: ...................
--
FROM 123.116.212.*
谢谢。这个issue里给的blog倒是说清楚了,就是给array加了个trait实现,然后对老的Rust edition做了个特殊判断(hack)避免break老代码。
http://rust-blog-draft.things.stuff.m-ou.se/2021/05/10/edition-2021.html
【 在 ilovecpp 的大作中提到: 】
:
https://github.com/rust-lang/rust/pull/84147--
FROM 123.115.133.*