如何使用字符串成员创建Rust结构?

时间:2014-09-09 23:03:25

标签: string rust

我希望成员归结构所有。抱歉这个简单的问题,但我找不到一个例子。我正在寻找结构和实例化示例的正确声明。

1 个答案:

答案 0 :(得分:74)

如果字符串必须由结构所有,那么您应该使用String。或者,您可以使用具有静态生命周期的&str(即程序的生命周期)。例如:

struct Foo {
    bar: String,
    baz: &'static str,
}

fn main() {
    let foo = Foo {
        bar: "bar".to_string(),
        baz: "baz",
    };
    println!("{}, {}", foo.bar, foo.baz);
}

如果字符串的生命周期未知,那么您可以使用生命周期参数化Foo

struct Foo<'a> {
    baz: &'a str,
}

另见:

如果您不确定该字符串是否拥有(对于避免分配有用),那么您可以使用borrow::Cow

use std::borrow::Cow;

struct Foo<'a> {
    baz: Cow<'a, str>,
}

fn main() {
    let foo1 = Foo {
        baz: Cow::Borrowed("baz"),
    };
    let foo2 = Foo {
        baz: Cow::Owned("baz".to_string()),
    };
    println!("{}, {}", foo1.baz, foo2.baz);
}

请注意,Cow类型在生命周期内进行参数化。生命周期是指借用的字符串的生命周期(即,当它是Borrowed时)。如果您有Cow,那么您可以使用borrow并获得&'a str,您可以使用该borrow执行正常的字符串操作,而无需担心是否分配新字符串。通常,由于deref强制,不需要显式调用Cow。也就是说,&*val值会自动取消引用其借用的表单,因此val其中Cow<'a, str>类型为&str会生成{{1}}。