Rust 试着用锈片实现构建器函数

Rust 试着用锈片实现构建器函数,rust,lifetime,Rust,Lifetime,我正在尝试实现生成器功能: extern crate debug; use std::mem::size_of_val; #[deriving(Show, PartialEq)] pub struct A<'a> { pub a: &'a [i64], pub b: &'a str, } fn build<'a>() -> A<'a> { return A { a: &[1,2,3], b: "

我正在尝试实现生成器功能:

extern crate debug;


use std::mem::size_of_val;


#[deriving(Show, PartialEq)]
pub struct A<'a> {
    pub a: &'a [i64],
    pub b: &'a str,
}


fn build<'a>() -> A<'a> {
    return A { a: &[1,2,3], b: "test" };
}


fn main() {
    let a = build();
    println!("{} - {} - `{:?}`", a, size_of_val(&a), a);
}
所有工作权利:

A { a: [1, 2, 3], b: test } - 40 - `A<'static>{a: collections::vec::Vec<i64>{len: 3u, cap: 4u, ptr: (0x7f1097426000 as *mut ())}, b: "test"}`

A{A:[1,2,3],b:test}-40-`A提示你的一生中有问题:

fn build<'a>() -> A<'a> { /* ... */ }
但问题来了:因此,您的两个引用必须链接到静态存储。你很幸运,
&str
在这里是个特例。字符串文本(
“test”
在您的情况下)始终处于静态存储中。到目前为止还不错

但是
&[1,2,3]
不在静态存储中。实际上,这个快捷方式相当于:

let temp = [1,2,3];
return A { a: &temp, b: "test" };
现在,寿命问题变得显而易见

解决方法非常简单:显式地将临时变量设置为static,如下所示:

fn build() -> A<'static> {                    //'
    static temp: [i64, ..3] = [1,2,3];
    return A { a: &temp, b: "test" };
}

fn build()->ANote:另一种方法是将切片作为参数传递给
build
,从而推断生存期:
fn buildA@Levans,因此在这种情况下,变量
temp
将是静态的,并且只释放程序结束。在我的例子中,它应该从http或具有巨大数据量的文件中获取数据。目前看来,
Vec
String
更适合于此,但对于不可变数据,它有不必要的容量。无论对切片和str执行此操作有多有趣?@tbicr在使用切片和str时,您需要拥有其他数据。Vec和切片之间的真正问题不是容量,而是数据存储的位置。如果您的A结构将存储它,那么您必须使用Vec和String.libdebug,顺便说一句,
{:?}
现在已经不存在了。只需使用
rustup.sh
-更新即可-仍在工作,并且没有弃用的警告。无论您是否运行了
rustup.sh
,您都不会调用新的Rust版本。libdebug已经完全消失了好几天了。好吧,就像我安装
rustup.sh--prefix=/path
然后
/path/bin/cargo
rustc
代替
/path/bin/rustc
。谢谢
fn build() -> A<'static>
let temp = [1,2,3];
return A { a: &temp, b: "test" };
fn build() -> A<'static> {                    //'
    static temp: [i64, ..3] = [1,2,3];
    return A { a: &temp, b: "test" };
}