【发布时间】:2014-03-05 03:45:41
【问题描述】:
所以,在:
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());
..但我不是。传递给此函数的生命周期是生命周期的instance,它不是生命周期的 TYPE,因此该注释对我来说没有任何意义。
我的意思是,我基本上明白发生了什么(我认为):返回的~[&str] 与调用者的作用域具有相同的生命周期,大概是test_can_create_struct() 函数。那是因为(据我了解)函数 v1 是在调用函数的生命周期 instance 中调用的。
非常混乱。
然后我们还有一些其他示例,例如: 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(),则生命周期继承自create调用;即,只要父 Data 对象存在,返回的 State 对象就会存在。
...但显然这也是错误的。所以我现在根本不知道生命周期变量是什么意思。
救命!
【问题讨论】:
-
生命周期是类型系统的一部分;它们不是实例。