Esiste un tipo di cancellazione di generici in Rust (come in Java) o no? Non riesco a trovare una risposta definitiva.Rust cancella i tipi generici o no?
risposta
Quando si utilizza una funzione generica o un tipo generico, il compilatore genera un'istanza separata per ciascun set distinto di parametri di tipo (credo che i parametri di durata siano ignorati, in quanto non hanno alcuna influenza sul codice generato). Questo processo si chiama monomorfizzazione. Ad esempio, Vec<i32>
e Vec<String>
sono diversi tipi, e quindi Vec<i32>::len()
e Vec<String>::len()
sono diverse funzioni. Questo è necessario, perché Vec<i32>
e Vec<String>
hanno diversi layout di memoria e quindi hanno bisogno di un codice macchina diverso! Pertanto, no, non è presente alcun tipo di cancellazione.
Se usiamo Any::get_type_id()
(instabile per ora, quindi deve essere compilato con un compilatore notturno), come il seguente esempio:
#![feature(get_type_id)]
use std::any::Any;
fn main() {
let v1: Vec<i32> = Vec::new();
let v2: Vec<String> = Vec::new();
let a1 = &v1 as &Any;
let a2 = &v2 as &Any;
println!("{:?}", a1.get_type_id());
println!("{:?}", a2.get_type_id());
}
otteniamo ID di tipo diverso per due istanze di Vec
. Questo supporta il fatto che Vec<i32>
e Vec<String>
sono tipi distinti.
Tuttavia, le capacità di riflessione in Rust sono limitate; Any
è praticamente tutto quello che abbiamo per ora. Non è possibile ottenere ulteriori informazioni sul tipo di un valore di runtime, come il suo nome oi suoi membri. Per poter lavorare con Any
, devi eseguirlo (usando Any::downcast_ref()
o Any::downcast_mut()
per un tipo noto al momento della compilazione.
Sembra che io e te non siamo d'accordo^_ ^. Forse c'è una sfumatura nella domanda che sto mancante ... – Shepmaster
@Shepmaster: in Java, la cancellazione di tipo è rilevante perché è come se i parametri del tipo non fossero mai stati lì. Ad esempio, è possibile memorizzare un 'String' in un 'ArrayList
Che dire 'Vec
- 1. Come confrontare i tipi generici?
- 2. Marshalling .NET tipi generici
- 3. con tipi generici
- 4. Devo evitare i tipi annidati nei tipi generici?
- 5. Compilazione separata per generici in Rust
- 6. tipi anonimi e generici
- 7. Raccolta dei tipi generici
- 8. Tipi generici ricorsivi
- 9. Tipi instantiating generici
- 10. Raccolta di tipi generici
- 11. generici Java e tipi numerici
- 12. Guice: come legare i generici per TUTTI i tipi?
- 13. raccolta di diversi tipi generici
- 14. C++ Matrice di puntatori: cancella o cancella []?
- 15. Errore nell'utilizzo di tipi e generici associati
- 16. polimorfismo C# in tipi generici
- 17. Completamento automatico per i tipi generici in Eclipse
- 18. Tipi generici, proprietà e strutture dati persistenti
- 19. System.Array esegue il boxing sui tipi di valore o no?
- 20. Utilizzando vincoli generici con i tipi di valore
- 21. Tipo controllo di una classe con i tipi generici
- 22. Tipi generici vs Classe astratta/Interfacce
- 23. Rust book, tipi indecisi di giochi indovinati
- 24. Perché il runtime mostra i tipi generici come "GenericType`n"?
- 25. Perché i tipi generici non possono avere un layout esplicito?
- 26. I tipi di dati MakeGenericType/generici vengono raccolti?
- 27. Come utilizzare i tipi generici parametrizzati in una classe interna?
- 28. NET: i tipi generici dedotto sui metodi statici
- 29. aggiornamento Castello di Windsor provoca TypeLoadException per i tipi generici
- 30. intesa anomalia sicurezza rispetto ai tipi con i generici Java
Potrebbe essere necessario definire cosa intendi per "cancellazione tipo" per ottenere il risposte più utili – Shepmaster
@Shepmaster La cancellazione dei caratteri per i generici è [un concetto ben definito] (https://docs.oracle.com/javase/tutorial/java/generics/erasure.html) in linguaggio JVM come Java e Scala, ma non si verifica con i generici in qualsiasi altra lingua che conosco.Le persone che conoscono il moderno Java sapranno cosa significa "cancellazione di tipo". – Iceberg