() - >&str函数的不可理解的行为

Ser*_*zko 0 pointers lifetime rust

我是生锈的新人,不明白一刻:

指针指南说:"你真的不应该返回指针".我没关系,但在我的HelloWorld程序中,我试图返回&str.我不需要盒装字符串,只需要&str立即打印它.我成功地在这个挑战中,但只是部分地.

所以,问问自己:

为什么我做到

    fn foo(p: &[uint]) -> &str { "STRING" }
Run Code Online (Sandbox Code Playgroud)

,但不能

    fn foo(p: Vec<uint>) -> &str { "STRING" } //error: missing lifetime specifier [E0106]
Run Code Online (Sandbox Code Playgroud)

,但仍然可以

    fn foo(p: Vec<uint>) -> &'static str { "STRING" }
Run Code Online (Sandbox Code Playgroud)

什么改变了从切片切换到Vec的事实?

PS抱歉我的假英语和假问题.我想,我只是没有得到一个生锈的借用者

Arj*_*jan 7

这是自动添加生命周期说明符的方式:

这个:

fn foo(p: &[uint]) -> &str { "STRING" }
Run Code Online (Sandbox Code Playgroud)

在过去你必须把它写成明确的:

fn foo<'a>(p: &'a [uint]) -> &'a str { "STRING" }
Run Code Online (Sandbox Code Playgroud)

这两个是等价的(但不是很准确,因为输入p和返回str不相关).它的工作原理是因为'static> 'a所以它始终对任何生命都有效.

第二个例子不起作用,因为没有输入引用所以没有添加自动生命周期参数,整个事情没有意义(每个引用需要一个生命周期,显式或隐式):

fn foo(p: Vec<uint>) -> &str { "STRING" }
Run Code Online (Sandbox Code Playgroud)

正如您已经通过添加生命周期来修复它:

fn foo(p: Vec<uint>) -> &'static str { "STRING" }
Run Code Online (Sandbox Code Playgroud)