如下代码,在初始化的时候,我需要往a中加入部分元素,然后把a中部分元素的引用放入b中,这里的生命周期似乎标注不了。 谢谢各位大佬
struct Container
{
a: Vec<i32>,
b:Vec<&'a i32>,
}
1
共 20 条评论, 1 页
如下代码,在初始化的时候,我需要往a中加入部分元素,然后把a中部分元素的引用放入b中,这里的生命周期似乎标注不了。 谢谢各位大佬
struct Container
{
a: Vec<i32>,
b:Vec<&'a i32>,
}
评论区
写评论那你为啥不存下标呢?
那你为啥不存下标呢?
https://rustcc.cn/article?id=b55eca8f-82ce-45c4-b902-c1c0059727aa
等下
苦瓜小仔
被你逼疯。等于说这里有自引用。 如果可以确保a初始化后就不会更改,搜集元素下标也是可行的。
如果是指针版本就类似这种:
区别就只是相对寻址和绝对寻址。
使用'static生命周期是多余的,可使用下面方式:
--
👇
sin: 大佬,谢谢,你发的这个我学到了。
不过你写的这个确实对我这种新手学习rust有很大帮助,十分感激。
--
👇
byeblack: ``` fn main() { // 无法更改a的值, 所以你每次都需要重新初始化 let z = (1..10).collect::<Vec>(); let mut x = Solution1 { a: z, b: vec![] }; x.a.iter().for_each(|i| { if i % 2 == 0 { x.b.push(i) } }); println!("{:?}", x); // x.a[0] = 10; // cannot borrow
x.a
as mutable because it is also borrowed as immutable}
#[derive(Debug)] struct Solution1<'a> { a: Vec, b: Vec<&'a i32>, }
#[derive(Debug)] struct Solution2 { a: Vec, b: Vec, }
impl Solution2 { // 初始化 fn new(value: Vec) -> Self { let mut x = Solution2 { a: value, b: vec![], }; x.build_index(); x }
}
哈哈,大佬,你写的很棒,但是似乎不够rusty[旺柴]
--
👇
byeblack: ``` fn main() { // 无法更改a的值, 所以你每次都需要重新初始化 let z = (1..10).collect::<Vec>(); let mut x = Solution1 { a: z, b: vec![] }; x.a.iter().for_each(|i| { if i % 2 == 0 { x.b.push(i) } }); println!("{:?}", x); // x.a[0] = 10; // cannot borrow
x.a
as mutable because it is also borrowed as immutable}
#[derive(Debug)] struct Solution1<'a> { a: Vec, b: Vec<&'a i32>, }
#[derive(Debug)] struct Solution2 { a: Vec, b: Vec, }
impl Solution2 { // 初始化 fn new(value: Vec) -> Self { let mut x = Solution2 { a: value, b: vec![], }; x.build_index(); x }
}
感谢大佬点播,我发现确实需要Pin住,我去学习一下这方面的知识。
--
👇
zylthinking: 不过这可能没有什么意义, 因为 vec 可能会内存重分配, 因此引用还是会失效, 而且 'a 同于 Container liveness scope, 只读引用还好, b: Vec<&'a mut i32> 就不好办了
--
👇
zylthinking: ``` struct Container<'a> { a: Vec, b: Vec<&'a i32>, }
--
👇
aj3n: 如果你原始问题就是需要保存一个i32的引用,我想提出这是没有意义的,不如直接解引用复制; 否则建议直接保存下标;
大概的代码是这样的,我想把container的初始化封装到new中,但是编译器提示我不能这样借用。
我很确定的是a第一次初始化以后不会再修改了,这里的A和B是两个结构体,我先对A结构体初始化以后,对B结构体初始化需要保存A的引用,我想知道的是有没有什么办法来让他们一次完成初始化。
--
👇
zylthinking: 不过这可能没有什么意义, 因为 vec 可能会内存重分配, 因此引用还是会失效, 而且 'a 同于 Container liveness scope, 只读引用还好, b: Vec<&'a mut i32> 就不好办了
--
👇
zylthinking: ``` struct Container<'a> { a: Vec, b: Vec<&'a i32>, }
大佬,谢谢,你发的这个我学到了。
👇
Wuyan: 如果你能处理好
a
移动后b
做对应更改的话,不知道下面这样是否满足你的要求:当
a
容量改变时,要注意重新分配内存导致b
可能失效问题(需要重新设置b),如果你呢b
取a
连续内存的引用也可采用下面的方式:--
👇
byeblack: 这种?
大佬,你发的这个是先把空向量赋给b,然后往b里面添加,我想问的是有没有什么办法在初始化的时候一步到位。
如果你能处理好
a
移动后b
做对应更改的话,不知道下面这样是否满足你的要求:当
a
容量改变时,要注意重新分配内存导致b
可能失效问题(需要重新设置b),如果你呢b
取a
连续内存的引用也可采用下面的方式:不过这可能没有什么意义, 因为 vec 可能会内存重分配, 因此引用还是会失效, 而且 'a 同于 Container liveness scope, 只读引用还好, b: Vec<&'a mut i32> 就不好办了
--
👇
zylthinking: ``` struct Container<'a> { a: Vec, b: Vec<&'a i32>, }
这里有介绍
https://quinedot.github.io/rust-learning/pf-meta.html#avoid-self-referential-structs
如果你原始问题就是需要保存一个i32的引用,我想提出这是没有意义的,不如直接解引用复制; 否则建议直接保存下标;
这种?
不过确实却要 Pin 住
这种属于自引用生命周期难搞,这种应用场景应该用 Rc 或者 Arc 引用计数合适点