2014-10-13 11 views
5

Il codice simile a questo:È possibile utilizzare std :: rc :: Rc con un tipo di tratto?

// Simplified 
pub trait Field: Send + Sync + Clone { 
    fn name(&self); 
} 

#[deriving(Clone)] 
pub enum Select { 
    SelectOnly(Vec<Rc<Field>>), 
    SelectAll 
} 

L'errore è:

the trait `core::kinds::Sized` is not implemented for the type `Field+'static` 

C'è un altro modo per avere il vettore con riferimento contati immutabili oggetti di tipo caratteristica?

Suppongo che posso riscrivere il codice come questo:

#[deriving(Clone)] 
pub enum Select { 
    SelectOnly(Vec<Rc<Box<Field>>>), 
    SelectAll 
} 

E 'la strada giusta?

risposta

3

Credo che dovrebbe essere possibile con l'ora legale, ma Rust non è ancora lì. La principale motivazione per l'ora legale era esattamente il desiderio di usare oggetti tratti con qualsiasi tipo di puntatore intelligente. Per quanto ne so, questo dovrebbe essere possibile con la versione 1.0.

Come soluzione temporanea, in effetti, è possibile utilizzare Rc<Box<T>>, anche se questo tipo di double indirection è sfortunato.

3

È possibile creare un oggetto con una caratteristica Rc come di ruggine 1.1. Questo compila:

use std::rc::Rc; 

trait Field: Send + Sync { 
    fn name(&self); 
} 

enum Select { 
    Only(Vec<Rc<Field>>), 
    All, 
} 

// --- 

struct Example; 
impl Field for Example { 
    fn name(&self) {} 
} 

fn main() { 
    let fields: Vec<Rc<Field>> = vec![Rc::new(Example)]; 
    Select::Only(fields); 
} 

Nota che il vostro esempio originale utilizzato Clone, ma non si può fare una tale caratteristica in un oggetto caratteristica perché è not object safe. L'ho rimosso per rispondere alla domanda.

Ho anche rimosso la ridondanza dei nomi delle varianti enum.

+0

Se si sostituisce 'Rc' con' RefCell', non viene compilato. Ma 'RefCell ' prende 'T:? Sized' (nella sua definizione, proprio come' Rc') ora. Cosa mi manca? – John

+1

Pensavo che avrei risposto io stesso - 'RefCell ' è un tipo valido, ma è anche unsized. 'RefCell' non implementa' CoerceUnsized' (vedere [RFC-0982] (https://github.com/rust-lang/rfcs/blob/master/text/0982-dst-coercion.md)) – John

+0

rustc 1.20. 0-nightly (622e7e648 2017-06-21) errore [E0038]: il carattere 'Campo' non può essere trasformato in un oggetto ->: 9: 16 | 9 | SelectOnly (Rc ), | ^^^^^^^^^^ Il carattere 'Field' non può essere trasformato in un oggetto | = nota: il tratto non può richiedere quell'effetto 'Sé: dimensionato ' errore: interruzione a causa di errori precedenti – Yash

Problemi correlati