我是生锈的新手,并且不理解一刻:
Pointer's Guide说:“你真的不应该回指针”。我没关系,但在我的HelloWorld程序中,我试图返回& str。我不需要盒装字符串,只需& str即可立即打印它。我在这个挑战中取得了成功,但只是部分成功。
所以,提问自己:
为什么我可以执行
fn foo(p: &[uint]) -> &str { "STRING" }
,但不能执行
fn foo(p: Vec<uint>) -> &str { "STRING" } //error: missing lifetime specifier [E0106]
,但仍然可以执行
fn foo(p: Vec<uint>) -> &'static str { "STRING" }
从切片切换到Vec会改变什么事实?
P.S。抱歉我的假英语和假问题。我想,我只是没有得到一个生锈的借用 - 妓女
答案 0 :(得分:7)
这就是自动添加生命周期说明符的方法:
此:
fn foo(p: &[uint]) -> &str { "STRING" }
过去你必须把它写成明确的:
fn foo<'a>(p: &'a [uint]) -> &'a str { "STRING" }
这两个是等价的(但由于输入p
并且返回str
不相关,因此不准确)。它有效,因为'static
&gt; 'a
所以在任何生命中都是有效的。
第二个例子不起作用,因为没有输入参考,所以没有自动生命周期 添加参数并且整个事情没有意义(每个引用都需要生命周期,显式或隐式):
fn foo(p: Vec<uint>) -> &str { "STRING" }
正如您已经做过的那样,您可以通过添加生命周期来解决它:
fn foo(p: Vec<uint>) -> &'static str { "STRING" }