Rust 为什么我可以对具有不同生存期的变量使用相同的生存期标签?
这段代码为什么要编译Rust 为什么我可以对具有不同生存期的变量使用相同的生存期标签?,rust,Rust,这段代码为什么要编译 #[derive(Debug)] pub struct Foo<'a> { pub x: &'a [&'a str], } fn main() { let s = "s".to_string(); let t: &str = s.as_ref(); { let v = vec![t]; let foo = Foo { x: &v[..] }; pri
#[derive(Debug)]
pub struct Foo<'a> {
pub x: &'a [&'a str],
}
fn main() {
let s = "s".to_string();
let t: &str = s.as_ref();
{
let v = vec![t];
let foo = Foo { x: &v[..] };
println!("{:?}", &foo);
}
}
#[派生(调试)]
pub struct Foo
我对这些生命周期标签的理解是,切片和单个&strs
具有相同的生命周期
这是一种常见的误解。这确实意味着必须有一个适用于两者的生命周期。实例化时,Foo
struct的'a
对应于let v=vec!之后的内部块的行![t] )代码>因为这是两个变量共享的生命周期
如果这种灵活性不存在,那么使用寿命将非常痛苦。在两行上定义的变量具有不同的实际寿命(第一行定义的变量比第二行定义的变量寿命长)。如果生命周期必须真正匹配,我们就必须在同一行定义所有变量
有关更多详细信息,请参阅
我对这些生命周期标签的理解是,切片和单个&strs
具有相同的生命周期
这是一种常见的误解。这确实意味着必须有一个适用于两者的生命周期。实例化时,Foo
struct的'a
对应于let v=vec!之后的内部块的行![t] )代码>因为这是两个变量共享的生命周期
如果这种灵活性不存在,那么使用寿命将非常痛苦。在两行上定义的变量具有不同的实际寿命(第一行定义的变量比第二行定义的变量寿命长)。如果生命周期必须真正匹配,我们就必须在同一行定义所有变量
有关更多详细信息,请参见。语法'a
实际上用于两种不同的情况:
- 标记循环
- 表示界限的
第一种情况,标记循环:
fn main() {
'a: loop {
println!("{}", 3);
break 'a;
}
}
在这里,'a
清楚地描绘了线圈体的寿命,并允许一次性从多层线圈中断开
第二种情况,也是更相似的情况,是使用'a
表示边界:
可通过以下方式调用:
fn<'a> call(o: &'a str, flag: bool) -> &'a str {
either(o, "Hello, World", flag)
}
fn&a str{
或者(o,“你好,世界”,国旗)
}
这里,o
的生存期未知(一些'a
),而“Hello,World”
的生存期已知('static
),'static
的定义是生存期中的较大者(它适用于所有程序)
- 调用
call
的调用方只知道返回值的寿命至少与o
调用
必须保证这一点,它将o
和“你好,世界”
提供给其中'b
被推断为'a
和'static
之间的最低界限(因此'a
)
要么
只需返回与其中一个参数寿命相同的内容;它不知道他们的一生可能不同,也不在乎
语法
'a
实际上用于两种不同的情况:
- 标记循环
- 表示界限的
第一种情况,标记循环:
fn main() {
'a: loop {
println!("{}", 3);
break 'a;
}
}
在这里,'a
清楚地描绘了线圈体的寿命,并允许一次性从多层线圈中断开
第二种情况,也是更相似的情况,是使用'a
表示边界:
可通过以下方式调用:
fn<'a> call(o: &'a str, flag: bool) -> &'a str {
either(o, "Hello, World", flag)
}
fn&a str{
或者(o,“你好,世界”,国旗)
}
这里,o
的生存期未知(一些'a
),而“Hello,World”
的生存期已知('static
),'static
的定义是生存期中的较大者(它适用于所有程序)
- 调用
call
的调用方只知道返回值的寿命至少与o
调用
必须保证这一点,它将o
和“你好,世界”
提供给其中'b
被推断为'a
和'static
之间的最低界限(因此'a
)
要么
只需返回与其中一个参数寿命相同的内容;它不知道他们的一生可能不同,也不在乎
感谢您的回答和链接!这非常有用谢谢你的回答和链接!那很有帮助