Подтвердить что ты не робот

Как создать структуру Rust со строковыми членами?

Я хочу, чтобы члены принадлежали структуре. Извините за простой вопрос, но я не смог найти пример. Я ищу правильное объявление структуры и примеры реализации.

4b9b3361

Ответ 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). Если у вас есть Cow, то вы можете использовать borrow и получить &'a str, с помощью которого вы можете делать обычные строковые операции, не заботясь о том, чтобы выделить новую строку или нет. Как правило, явный вызов borrow не требуется из-за разыменных принуждений. А именно, значения Cow будут автоматически разыменовываться в заимствованную форму, поэтому &*val где val имеет тип Cow<'a, str> создаст &str.