代码希望将x
和y
约束为相同的生存期,并使用了一个函数来实现这一点。但是,当删除y
时,编译器不会出错。这是否意味着,无论函数返回值如何,生存期边界在函数参数之间都不起作用?
static S: String = String::new();
// `x` and `y` have the same lifetime
fn foo<'a>(x: &'a String, y: &'a String) -> &'static String {
if x == y {
&S
} else {
&S
}
}
fn main() {
let z;
let x = &"x".to_string();
{
let y = &"y".to_string();
z = foo(x, y);
} // drops `y`
dbg!(x);
dbg!(z);
}
1条答案
按热度按时间sgtfey8w1#
要求“相同”的生存期只是意味着编译器必须找到 * 某个 * 单一的生存期,该生存期与
x
和y
引用的对象的作用域相匹配,并不意味着它们必须具有相同的作用域。因为你的函数在返回位置不使用生存期,而且它们是不可变的,所以它没有用。一个有用的只有参数的生存期通常会涉及到变异--例如:
如果你试图在这里省略生存期,函数将无法编译,因为这样会允许将短期引用附加到一个需要静态引用的向量上。