Rust:如何使用字符串成员创建struct?

vla*_*mir 46 string rust

如何使用字符串成员创建结构?成员应该由struct对象拥有.我刚刚生锈,对不起简单的问题,但我找不到一个例子.有一些过时的例子使用"〜"似乎已被弃用...我正在寻找正确的struct声明然后实例化示例.

Bur*_*hi5 82

如果字符串必须由struct拥有,那么你应该使用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);
}
Run Code Online (Sandbox Code Playgroud)

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

struct Foo<'a> {
    baz: &'a str,
}
Run Code Online (Sandbox Code Playgroud)

如果您不确定该字符串是否拥有(对于避免分配有用),那么您可以使用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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,该Cow类型是在整个生命周期中参数化的.生命周期是指借来的字符串的生命周期(即,它是a Borrowed).如果你有Cow,那么你可以使用borrow并获得一个&'a str,你可以用它来做正常的字符串操作,而不用担心是否分配新的字符串.(典型地,显式调用borrow不是必须的,因为DEREF的.即,Cow值将自动DEREF其借形式.因此,&*val其中val已键入Cow<'a, str>会产生&str).

String语法确实过时了.替换为&stris Foo,您可以将其视为字符串缓冲区(即,字符串的内容是可修改的并且可以增长).A borrow::Cow是字符串的不可变视图,无法在安全代码中更改.

  • 呃,谢谢你的完整答案.我需要考虑另一天的寿命参数化:) (4认同)
  • 不使用String吗?这似乎是一个简短的答案,但是您提出问题的方式并没有给我太多选择。我怀疑您是XY问题的实例。我建议您提出一个新问题,详细说明您要解决的实际问题。 (2认同)