首页 > 解决方案 > Rust:为什么将未使用的 (_) 参数传递给函数会改变结果

问题描述

为什么下面的代码段错误

fn print() -> &str
{
   let name2 = "blah";
   return &name2;
}

fn main() {
   let x = print();
   println!("{}", x);
}

但不是这个

fn print(_: &str) -> &str
{
   let name2 = "blah";
   return &name2;
}

fn main() 
{
   let x = print("");
   println!("{}", x);
}

唯一的区别是在最后一种情况下被忽略的附加参数

标签: rust

解决方案


错误消息非常清楚地告诉您第一个片段失败的原因:

1 | fn print() -> &str
  |               ^ expected named lifetime parameter

您要返回一个参考,参考必须有一个生命周期来表明它们的有效性。您不提供生命周期,而 rustc 的规则也不提供任何生命周期,因此编译失败。

在第二个片段中,您传入一个引用。终身省略后:

如果只有一个输入生命周期位置(是否省略),则将该生命周期分配给所有省略的输出生命周期。

rustc 将使用输入生命周期作为输出,因此第二个片段本质上是

fn print(_: &'a str) -> &'a str

由于字符串文字有生命周期'static,它可以被“强制”到任何生命周期(因为它们都更短),因此返回name2which is an&'static str不会破坏合同:它对于调用者提供和想要的任何内容都是有效的。


推荐阅读