gpt4 book ai didi

generics - 为什么此生命周期不是 "expire"?

转载 作者:行者123 更新时间:2023-12-03 11:25:58 27 4
gpt4 key购买 nike

对于下面的 block ,生命周期'b'c什么时候结束?

use core::ops::Deref;

#[derive(Debug)]
struct A<'b, 'c, T> {
child_b: &'b T,
child_c: &'c T
}

impl<'b, 'c, T> A<'b, 'c, T> {
pub fn new_wrapper(b_value: &'b T, c_value: &'c T) -> A<'b, 'c, T> {
A {
child_b: b_value,
child_c: c_value
}
}
}

fn doesnt_drop_borrow<T: Copy>(ty: &T) {
*ty;
}

fn drop<T>(ty: T) { }

fn main() {
let b: String = "wonderful".into();
let c: String = "lifetime".into();
let a = A::new_wrapper(&b, &c);
println!("hello this {:?} world", &a);
doesnt_drop_borrow(&a.child_c);
drop(a.child_c);
println!("hello this {:?} world", &a);
}

最佳答案

由于 a.child_c 的类型为 &String,因此 ty 参数在doesnt_drop_borrow(&a.child_c) 的类型为 &&String,并且*ty 的类型为 &String 所以原始的 String (c) 不会被丢弃。

我不知道是什么激发了你的问题,但我想事实上,在调用 drop(a.child_c) 之后,您仍然可以使用 a。此函数的名称具有误导性,因为此处的 ty 参数具有类型 &String(与 a.child_c 相同)。所以 ty 参数显示为原始的新的不可变借用c, then 立即被丢弃,但原来的 c 并没有被丢弃。当引用被删除时,引用的值不是。

这两个函数实际上都没有移动原始的String,他们只处理引用。

所以 bc 一直活到 main() 结束,a 也是如此其中包含对它们的引用。

关于generics - 为什么此生命周期不是 "expire"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63785170/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com