所以,在:
fn v1<'a> (a:~[&'a str]) -> ~[&'a str] {
return a;
}
#[test]
fn test_can_create_struct() {
let x = v1("Hello World".split(' ').collect());
}
我知道,我已经阅读了http://static.rust-lang.org/doc/master/guide-lifetimes.html#named-lifetimes,但我不明白这段代码实际上是做什么的。
这个函数基本上像一个带有生命周期的通用fn一样进行参数化,这是我在IRC频道上看到的说法,但让我们想象一下这种情况,并且我们有一个L,它是一些特定的生命周期结构。
显然,我隐式调用了:
v1::<L>("Hello World".split(' ').collect());
但是我并不是这样认为的。传递给该函数的lifetime是一个lifetime实例,而不是lifetime类型,因此那个注释对我来说没有任何意义。
我的意思是,我基本上理解发生了什么(我想):返回的~[&str]
与调用者的作用域具有相同的lifetime,可能是test_can_create_struct()
函数。这是因为(据我所知),函数v1
使用来自调用函数的lifetime实例进行调用。
非常令人困惑。
然后我们有一些其他的例子,比如: https://gist.github.com/bvssvni/8970459
这里是一个片段:
impl<'a> Data<'a> {
pub fn new() -> Data<'a> {
Data { a: None, b: None }
}
pub fn a(&'a mut self, a: int) -> State<'a, Step1> {
self.a = Some(a);
State { data: self }
}
}
现在我天真地认为
Data<'a>
意味着函数 a()
的生命周期实例是相同的。也就是说,如果您创建了一个
Data
(let blah = Data::new()
)并调用 blah.a()
,则生命周期将从创建调用继承; 也就是说,返回的 State
对象将存在于父 Data
对象存在的时间内。但显然这也是错误的。所以我现在完全不知道生命周期变量的含义。
帮帮我!