Я хотел бы создать Rc<str>
, потому что я хочу уменьшить косвенность из-за двух указателей, требующих доступа к Rc<String>
. Мне нужно использовать Rc
, потому что у меня действительно есть совместное владение. Я детализирую в еще один вопрос более конкретные проблемы, которые возникают у моего типа строк.
pub struct Rc<T: ?Sized> { /* fields omitted */ }
Я также слышал, что Rust 1.2 придет с надлежащей поддержкой для хранения нестандартных типов в Rc
, но я не уверен, как это отличается от 1.1.
Взяв пример str
в качестве примера, моя наивная попытка (также 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
и затем принудительно замените его на нестандартный тип. Приведенный пример предназначен для хранения объекта-объекта: сначала создайте Rc<ConcreteType>
, а затем принудителю к Rc<Trait>
. Но это тоже не имеет смысла: ни this, ни this (и вы не можете принуждать от &str
или String
до str
) в любом случае.