如何创建一个包含字符串成员的Rust结构?

jm81lzqq  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(96)

我希望成员由结构体拥有。我正在寻找正确的结构体声明和示例化示例。我无法找到示例。

waxmsbnn

waxmsbnn1#

如果字符串必须由结构拥有,则应使用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);
}

如果字符串的生存期未知,那么可以用一个lifetime参数化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 字符串的生存期(即当它是一个Borrowed时),如果你有一个Cow,那么你可以使用borrow并得到一个&'a str,用它你可以做普通的字符串操作,而不用担心是否分配一个新的字符串,通常情况下,由于deref强制,不需要显式调用borrow。也就是说,Cow值将自动解引用到其借用形式,因此&*val(其中val具有Cow<'a, str>类型)将生成&str

相关问题