ho notato che ?Sized
è un limite al parametro di tipo T
per alcune funzioni (borrow
, borrow_state
e borrow_mut
), tuttavia, è non un balzo per new
o into_inner
. Se non riesco a creare un RefCell
contenente qualcosa di dimensioni dinamiche (RefCell<T : ?Sized>
), allora a che serve avere funzioni che possano funzionare su una cosa del genere?Perché è stato dimensionato un limite per alcune funzioni RefCell, ma non tutte?
5
A
risposta
4
Tale supporto era added in a commit that also added tests. Siamo in grado di guardare a quei test per vedere come ci si aspettava di essere utilizzato:
use std::cell::RefCell;
#[test]
fn refcell_unsized() {
let cell: &RefCell<[i32]> = &RefCell::new([1, 2, 3]);
{
let b = &mut *cell.borrow_mut();
b[0] = 4;
b[2] = 5;
}
let comp: &mut [i32] = &mut [4, 2, 5];
assert_eq!(&*cell.borrow(), comp);
}
è sempre necessario avere un costruttore con una Sized
vincolati come il compilatore ha bisogno di conoscere la quantità di spazio per allocare sullo stack. Una volta che hai, puoi quindi costringere a un tipo di dimensioni dinamiche.
È possibile creare un 'RefCell'? Ho provato 'RefCell :: new (x) as RefCell ', tuttavia, ho ricevuto un errore che diceva che 'Sized' non è implementato per' Any'. D'altra parte, 'Box :: new (x) come Box ' funziona bene. Sembrano avere restrizioni simili a quelle di "dimensioni". Cosa mi manca? https://play.rust-lang.org/?gist=5af8c51ac91d162d999f&version=stable –
Matt
@Matt una domanda interessante. Non conosco la risposta, ma ti incoraggio a fare una nuova domanda, ricollegando a questa domanda se ritieni che fornisca un contesto utile. – Shepmaster