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


72

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


1
使用String并注意,通过Stringfrom创建一个涉及到堆分配+复制整个字符串。&str.to_string()
sellibitze 2014年

Answers:


110

如果字符串必须由该结构拥有,则应使用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类型是在整个生命周期中进行参数化的。生命周期是指借用字符串的生命周期(即a Borrowed)。如果您有一个Cow,那么您可以使用borrow和获取一个&'a str,通过它您可以执行常规的字符串操作,而不必担心是否分配新的字符串。通常,borrow由于取消引用强制,因此不需要显式调用。即,Cow值将自动解除引用其借形式,所以&*val在那里val已类型Cow<'a, str>会产生&str


6
嗯,谢谢您的完整回答。我需要改天考虑终身参数化:)
vladimir

1
如果我具有包含Copy属性的结构(例如#[derive(Clone,Copy)],则String无法编译。最佳解决方案是什么?
tatmanblue

3
不使用String吗?这似乎是一个简短的答案,但是您提出问题的方式并没有给我太多选择。我怀疑您是XY问题的实例。我建议您提出一个新问题,详细说明您要解决的实际问题。
BurntSushi18年

该文档指出这String是可变的。如果我有一个结构,例如,一个name应该是不可变的字段,我还是应该使用String而不是str
Ondra K.

我不知道这与这个问题有什么关系。我建议你问一个新问题。
BurntSushi20年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.