【发布时间】:2015-10-19 13:31:03
【问题描述】:
我想创建一个Rc<str>,因为我想减少访问Rc<String> 所需的2 个指针的间接性。我需要使用Rc,因为我确实拥有共享所有权。我在another question 中详细介绍了我在字符串类型方面遇到的更具体的问题。
pub struct Rc<T: ?Sized> { /* fields omitted */ }
我还听说 Rust 1.2 将适当支持在 Rc 中存储未调整大小的类型,但我不确定这与 1.1 有何不同。
以str 为例,我的naive attempt(也是this,用于从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> 实例化一个T,然后将其强制为一个未调整大小的类型。给出的示例用于存储 trait 对象:首先创建 Rc<ConcreteType>,然后强制转换为 Rc<Trait>。但这也没有任何意义:this 和 this 都不起作用(而且你不能从 &str 或 String 强制转换为 str)。
【问题讨论】:
-
因为访问
Rc<String>需要遵循 2 个指针(另外,我需要Rc,因为我确实拥有共享所有权)。我详细介绍了in another question 我在字符串类型方面遇到的更具体的问题。我的暂定定义Rc<Utf16Str>还需要一个未调整大小的类型Utf16Str(它的布局与Rc<[u16]>相同)。
标签: rust