【问题标题】:How to create a Rust struct with string members?如何使用字符串成员创建 Rust 结构?
【发布时间】:2014-09-09 23:03:24
【问题描述】:

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

【问题讨论】:

  • 使用String 并注意从&str 通过.to_string() 创建String 涉及堆分配+复制整个字符串。

标签: string rust


【解决方案1】:

如果字符串必须由结构拥有,那么您应该使用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 字符串的生命周期(即,当它是 Borrowed 时)。如果您有Cow,那么您可以使用borrow 并获得&amp;'a str,您可以使用它进行正常的字符串操作,而无需担心是否分配新字符串。通常,由于 deref 强制,不需要显式调用 borrow。也就是说,Cow 值将自动取消引用到它们的借用形式,因此 &amp;*val 其中val 的类型为Cow&lt;'a, str&gt; 将产生&amp;str

【讨论】:

  • 嗯,谢谢您的完整回答。我需要改天考虑生命周期参数化:)
  • 如果我的结构包含 Copy 属性(例如 #[derive(Clone, Copy)],则 String 无法编译。最好的解决方案是什么?
  • 不使用字符串?这似乎是一个简短的答案,但你提出问题的方式并没有让我有太多选择。我怀疑您遇到的是 XY 问题的实例。我建议您提出一个新问题,详细说明您要解决的实际问题。
  • 文档指出String 是可变的。如果我有一个结构,例如,应该是不可变的 name 字段,我是否仍应使用 String 而不是 str
  • 我不明白这与这个问题有什么关系。我建议你问一个新问题。
猜你喜欢
  • 1970-01-01
  • 2021-09-15
  • 2021-07-10
  • 1970-01-01
  • 2015-02-26
  • 2016-07-12
  • 2022-07-29
  • 2019-12-28
  • 1970-01-01
相关资源
最近更新 更多