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

How to create a Rust struct with string members?

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


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

1
2
3
4
5
6
7
8
9
10
11
12
struct Foo {
    bar: String,
    baz: &'static str,
}

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

如果字符串的生存期未知,则可以使用生存期来参数化Foo

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

另请参见:

  • Rusts`String`和`str`有什么区别?

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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。即,Cow值将自动取消引用其借用形式,因此&*val其中val具有类型Cow<'a, str>的值将产生&str