rust 函数参数之间的生存期界限

2g32fytz  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(107)

代码希望将xy约束为相同的生存期,并使用了一个函数来实现这一点。但是,当删除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);
}
sgtfey8w

sgtfey8w1#

要求“相同”的生存期只是意味着编译器必须找到 * 某个 * 单一的生存期,该生存期与xy引用的对象的作用域相匹配,并不意味着它们必须具有相同的作用域。
因为你的函数在返回位置不使用生存期,而且它们是不可变的,所以它没有用。一个有用的只有参数的生存期通常会涉及到变异--例如:

fn append<'a>(v: &mut Vec<&'a str>, s: &'a str) {
    v.push(s);
}

如果你试图在这里省略生存期,函数将无法编译,因为这样会允许将短期引用附加到一个需要静态引用的向量上。

相关问题