如果有人能帮助我解决这个问题,我很感激。请看看这个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)中不需要静态引用?
1条答案
按热度按时间gzszwxb41#
get_slice_2
显式指定返回值对'static
有效.get_slice_1
和get_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
缺少任何输入生存期但包含输出生存期,它不匹配任何规则,因此被拒绝。