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抱歉我的假英语和假问题.我想,我只是没有得到一个生锈的借用者
这是自动添加生命周期说明符的方式:
这个:
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)
| 归档时间: |
|
| 查看次数: |
73 次 |
| 最近记录: |