rust 什么时候返回的切片不需要是静态的?

iyfamqjs  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

如果有人能帮助我解决这个问题,我很感激。请看看这个Rust代码:

fn main() {
    let _s0 = "s0";
    println!("{}", get_slice_1());
    println!("{}", get_slice_2());
    println!("{}", get_slice_3(_s0));
}

fn get_slice_1() -> &str {
    let _s1 = "s1";
    return _s1;
}

fn get_slice_2() -> &'static str {
    let _s2 = "s2";
    return _s2;
}

fn get_slice_3(_x: &str) -> &str {
    let _s3 = "s3";
    return _s3;
}

字符串
第一个函数get_slice_1的引用有一个问题,这个问题在第二个函数get_slice_2中得到了解决。到目前为止没有问题。
但是get_slice_3函数对我来说很奇怪,因为input _x:&str似乎没有作用,但get_slice_1也没有问题。为什么在最后一个函数(get_slice_3)中不需要静态引用?

gzszwxb4

gzszwxb41#

get_slice_2显式指定返回值对'static有效.
get_slice_1get_slice_3使用elided lifetimes,这是一种方便的机制,因此您不必在简单的场景中显式指定生存期。
get_slice_3根据第二条规则是有效的:
如果正好有一个输入生存期位置(消隐或未消隐),则将该生存期分配给所有消隐的输出生存期。
因此等价于fn get_slice_3<'a>(_x: &'a str) -> &'a str。请注意,在这种情况下,rust将阻止返回的str比传递给_x_x更长寿,即使它实际上是一个&'static str
get_slice_1缺少任何输入生存期但包含输出生存期,它不匹配任何规则,因此被拒绝。

相关问题