我想创建一个
很明显,为了创建一个
我被告知不能实例化这种类型,而是要实例化具有大小的
Rc<str>
,因为我想减少访问 Rc<String>
时需要跟随 2 个指针的间接性。我需要使用 Rc
,因为我确实拥有共享所有权。在 另一个问题 中,我详细阐述了我在字符串类型上遇到的更具体的问题。
Rc
有一个 ?Sized 约束:pub struct Rc<T: ?Sized> { /* fields omitted */ }
我也听说Rust 1.2将配备适当的支持,以在中存储不定大小的类型,但我不确定这与1.1有什么区别。
以上面为例,我的naive attempt(还有这个是构建一个String
)会失败:
use std::rc::Rc;
fn main() {
let a: &str = "test";
let b: Rc<str> = Rc::new(*a);
println!("{}", b);
}
error[E0277]: the trait bound `str: std::marker::Sized` is not satisfied
--> src/main.rs:5:22
|
5 | let b: Rc<str> = Rc::new(*a);
| ^^^^^^^ `str` does not have a constant size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `str`
= note: required by `<std::rc::Rc<T>>::new`
很明显,为了创建一个
Rc<str>
,我需要复制整个字符串:RcBox
本身将是一个不定长类型,存储字符串本身以及弱引用和强引用指针——上面的天真代码甚至没有意义。我被告知不能实例化这种类型,而是要实例化具有大小的
T
的Rc<T>
,然后将其强制转换为不定长类型。给出的示例是存储特质对象:首先创建Rc<ConcreteType>
,然后强制转换为Rc<Trait>
。但这也没有意义:既不这样,也不那样工作(无论如何,你都不能从&str
或String
强制转换为str
)。
Rc<String>
需要遵循 2 个指针(此外,我需要Rc
,因为我真正拥有共享所有权)。我在另一个问题中详细说明了我围绕字符串类型遇到的更具体的问题。我的暂定定义Rc<Utf16Str>
还需要一个不定大小的类型Utf16Str
(它将具有与Rc<[u16]>
相同的布局)。 - darque