rust - 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);
}
唯一的区别是在最后一种情况下被忽略的附加参数
解决方案
错误消息非常清楚地告诉您第一个片段失败的原因:
1 | fn print() -> &str | ^ expected named lifetime parameter
您要返回一个参考,参考必须有一个生命周期来表明它们的有效性。您不提供生命周期,而 rustc 的规则也不提供任何生命周期,因此编译失败。
在第二个片段中,您传入一个引用。终身省略后:
如果只有一个输入生命周期位置(是否省略),则将该生命周期分配给所有省略的输出生命周期。
rustc 将使用输入生命周期作为输出,因此第二个片段本质上是
fn print(_: &'a str) -> &'a str
由于字符串文字有生命周期'static
,它可以被“强制”到任何生命周期(因为它们都更短),因此返回name2
which is an&'static str
不会破坏合同:它对于调用者提供和想要的任何内容都是有效的。
推荐阅读
- python - 为什么我的 for 循环只重复打印第一个 if 语句?
- javascript - 有人可以查看我的代码以获取对 Yelp API 的 HTTP 请求吗?
- flutter - Flutter Listview 排序动画
- android-studio - ViewPager2 刷卡后不重新创建 ui
- javascript - 如何从 Javascript 读取的 csv 数据中以 Shiny 显示表格?
- flutter - 通过按钮将 int 值更改为 0
- typescript - “NextApiRequest”类型的参数不可分配给“Request”类型的参数
- swift - 在 Swift/SwiftUI 中使用该值的结构函数中未更新变异值
- javascript - 我想使用具有授权令牌的 curl 请求下载文件,然后使用 cypress 将文件保存在本地目录中
- discord.js - discord.js上的Discord缺少意图错误