无法理解的行为() - > & str功能

时间:2014-10-06 15:16:38

标签: pointers rust lifetime

我是生锈的新手,并且不理解一刻

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。抱歉我的假英语和假问题。我想,我只是没有得到一个生锈的借用 - 妓女

1 个答案:

答案 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" }