Ich möchte ein Rc<str>
erstellen, weil ich die Indirektion von den 2 Zeigern, die der Zugriff auf eine Rc<String>
erfordert, reduzieren muss. Ich muss ein Rc
verwenden, weil ich wirklich Besitz geteilt habe. Ich nähere Details in another question spezifischere Probleme, die ich um meinen Schnurtyp habe.Wie baue ich einen Rc <str> oder Rc <[T]>?
pub struct Rc<T: ?Sized> { /* fields omitted */ }
ich auch habe gehört, dass Rust 1.2 wird zum Speichern unsized Typen in einem Rc
mit dem richtigen Unterstützung kommen, aber ich bin nicht sicher, wie dies von 1,1 unterscheidet.
den str
Fall als Beispiel nehmen, mein naive attempt (auch this für von einem String
Gebäude) nicht mit:
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`
Es ist klar, dass, um ein Rc<str>
zu schaffen, ich brauche das kopieren Ganzer String: RcBox
wäre selbst ein unselisierter Typ, der den String selbst neben den schwachen und starken Zeigern speichert - der naive Code oben macht überhaupt keinen Sinn.
Mir wurde gesagt, dass man solche Art nicht instanziieren kann, sondern instanziieren Sie eine Rc<T>
mit einer Größe T
und dann zwingen Sie es zu einem unsized-Typ. Das angegebene Beispiel dient zum Speichern eines Merkmalsobjekts: Zuerst erstellen Sie Rc<ConcreteType>
und dann erzwingen Sie Rc<Trait>
. Aber das macht auch keinen Sinn: weder this noch this funktionieren (und Sie können nicht von &str
oder String
zu str
sowieso zwingen).
Da der Zugriff auf ein 'Rc' erfordert, folgen Sie 2 Zeiger (auch, ich brauche 'Rc', weil ich wirklich die Eigentümerschaft geteilt habe). Ich erläutere [in einer anderen Frage] (https://stackoverflow.com/questions/31685345/is-there-a-rust-library-with-an-utf-16-string-type-intended-for-writing-a- Java) spezifischere Probleme, die ich mit meinem String-Typ habe. Meine vorläufige Definition 'Rc ' würde auch einen unsoziierten Typ 'Utf16Str' erfordern (es hätte das gleiche Layout wie' Rc <[u16]> '). –
darque
Siehe auch [Ist es möglich, einen Arc <[T\]> von einem Vec?] (Https://stackoverflow.com/q/44636833/155423) zu erstellen. –
Shepmaster