Chciałbym utworzyć Rc<str>
, ponieważ chcę zmniejszyć niedokładność z następujących 2 wskaźników, które wymagają dostępu do Rc<String>
. Muszę użyć Rc
, ponieważ naprawdę mam wspólną własność. Szczegółowo opisuję w another question bardziej szczegółowe problemy, które mam wokół mojego typu ciągu.Jak zbudować Rc <str> lub Rc <[T]>?
pub struct Rc<T: ?Sized> { /* fields omitted */ }
Słyszałem również, że Rust 1,2 przyjdzie z odpowiednim wsparciem dla przechowywania niezagruntowanej typy w Rc
, ale jestem pewien sposób różni się od 1.1.
Biorąc sprawę str
jako przykład, mój naive attempt (również this na budowę od String
) nie powiedzie się z:
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`
To jasne, że w celu stworzenia Rc<str>
, muszę skopiować cały ciąg: RcBox
byłby sam w sobie niezsynchronizowanym typem, przechowującym strunę obok słabych i mocnych wskaźników - powyższy naiwny kod nie ma nawet sensu.
Powiedziano mi, że nie można utworzyć tego typu, ale zamiast tego należy utworzyć instancję Rc<T>
o rozmiarze T
, a następnie przymusić ją do typu niezmienionego. Podany przykład dotyczy przechowywania obiektu cechy: najpierw stwórz Rc<ConcreteType>
, a następnie przymuszaj do Rc<Trait>
. Ale to też nie ma sensu: ani this, anidziałać (i nie można przymuszać z &str
lub String
do str
tak).
Ponieważ dostęp do 'Rc' wymaga następujących 2 wskaźników (również, potrzebuję 'Rc', ponieważ naprawdę mam współwłasność). Szczegółowo [w innym pytaniu] (https://stackoverflow.com/questions/31685345/is-there-a-rust-library-with-an-utf-16-tring-type-intended- forwriting-a- java) bardziej szczegółowe problemy Mam wokół mojego typu ciąg. Moja wstępna definicja "Rc " również wymagałaby typu niezmienionego 'Utf16Str' (miałaby taki sam układ jak' Rc <[u16]> '). –
darque
Zobacz także [Czy jest możliwe utworzenie łuku <[T\]> z Vec?] (Https://stackoverflow.com/q/44636833/155423). –
Shepmaster