Mi piacerebbe creare un Rc<str>
perché voglio ridurre l'indirezione dal seguire i 2 puntatori che richiedono l'accesso a un Rc<String>
. Devo usare uno Rc
perché ho veramente condiviso la proprietà. I dettagli in another question più problemi specifici che ho intorno al mio tipo di stringa.Come costruire un Rc <str> o Rc <[T]>?
pub struct Rc<T: ?Sized> { /* fields omitted */ }
Ho anche sentito che Rust 1.2 sarà disponibile con un adeguato sostegno per la memorizzazione di tipo non calibrati in un Rc
, ma io sono sicuro di come questo si differenzia da 1.1.
Prendendo il caso str
come esempio, il mio naive attempt (anche this per la costruzione di un String
) non riesce con:
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`
E 'chiaro che, al fine di creare un Rc<str>
, ho bisogno di copiare il tutta la stringa: RcBox
sarebbe di per sé un tipo non standardizzato, che memorizza la stringa stessa accanto ai puntatori deboli e forti: l'ingenuo codice sopra non ha nemmeno senso.
Mi è stato detto che non è possibile creare un'istanza di questo tipo, ma creare un'istanza di Rc<T>
con una dimensione T
e quindi forzarla in un tipo non bloccato. L'esempio fornito è per la memorizzazione di un oggetto tratto: prima creare Rc<ConcreteType>
e quindi forzare a Rc<Trait>
. Ma questo non ha alcun senso: né lo this né lo this funzionano (e non è possibile forzare da &str
o da String
a str
).
Perché l'accesso a 'Rc' richiede di seguire 2 puntatori (inoltre, ho bisogno di 'Rc' perché ho veramente condiviso la proprietà). Dettagli [in un'altra domanda] (https://stackoverflow.com/questions/31685345/is-there-a-rust-library-with-an-utf-16-string-type-intended-for-writing-a- java) problemi più specifici che ho intorno al mio tipo di stringa. La mia definizione provvisoria 'Rc ' richiederebbe anche un tipo non specificato 'Utf16Str' (avrebbe lo stesso layout di' Rc <[u16]> '). –
darque
Vedere anche [È possibile creare un Arc <[T\]> da un Vec?] (Https://stackoverflow.com/q/44636833/155423). –
Shepmaster