我正在开始使用 Rust。我想要一个包含(除其他外)字符串的结构:
#[derive(Clone, Debug)]
struct Foo {
string_field: &str, // won't compile, but suppose String or Box<str> or &'a str or &'static str...
}
我希望能够声明const
ants or static
s of it:
static FOO1: Foo = Foo {
string_field: "",
};
And I also希望能够让它包含在运行时构造的字符串:
let foo2 = Foo {
string_field: ("a".to_owned() + "b").as_str(),
};
我可以添加一个生命周期参数Foo
这样我就可以声明字符串引用具有相同的生命周期。这很好,除了它似乎需要一个显式的生命周期参数包含的一切 a Foo
,这意味着它使我的程序的其余部分变得复杂(甚至是不关心是否能够使用常量表达式的部分)。
我可以写
enum StringOfAdequateLifetime {
Static(&'static str),
Dynamic(Box<str>), // or String, if you like
}
struct Foo {
string_field: StringOfAdequateLifetime,
}
到目前为止,这似乎有效,但写出的文字却很混乱Foo
s.
似乎很明显,所期望的runtime行为是合理的:当你放下一个Foo
,删除它包含的字符串 - 如果它是静态的,则永远不会删除,因此不需要额外的信息来处理这两种情况。有没有一种干净的方法来向 Rust 请求这个?
(看来我可以使用某种“智能指针”类型来保存字符串也可以写成静态情况下的常量表达式,但我还没有在标准库中看到过,当我尝试泛化时StringOfAdequateLifetime
为了适用于任何类型,我在实施和使用各种标准特征时遇到了进一步的复杂情况,例如Deref
,我怀疑这是由于之间的差异Sized
和非Sized
types.)