Il libro di Rust afferma che "è quasi sempre meglio usare una struct che una struttura di tuple". Oltre al modello newtype, ci sono altri vantaggi nell'avere campi senza nome? A me sembra che il pattern newtype sia l'unico caso utile per avere le strutture di tuple.Quali sono alcuni casi d'uso per le strutture di tupla?
risposta
Sono molto simili tra loro.
Dato il seguente definitions
struct TupleStruct(i32, i32);
struct NormalStruct{ a: i32, b: i32 }
possiamo costruire esempi di strutture e le strutture tuple come segue
let ts = TupleStruct(1, 2);
let ns = NormalStruct { a: 1, b: 2};
// AFAIK, this shortcut to initialize the fields of a struct using the values of the fields
// of another struct can't be done using tuple structs.
let ns2 = NormalStruct {a: 5, ..ns};
incarichi di lavoro come segue
let TupleStruct(x, y) = ts;
println!("x: {}, y: {}", x, y);
let NormalStruct {a, b} = ns;
println!("a: {}, b: {}", a, b);
una struct tuple ' s campi ha ve nomi impliciti (0, 1, ...). Quindi, l'accesso ai campi è eseguita nel modo seguente
println!("Accessing ns by name - {}{}", ns.a, ns.b);
println!("accessing ts by name - {}{}", ts.0, ts.1);
Almeno a scopo di documentazione, è quasi sempre più chiaro per assegnare i nomi espliciti per i campi della struct. Ecco perché nella comunità di Rust ho visto molti discutere di aver sempre usato una normale struttura.
Tuttavia, potrebbero esserci casi in cui i campi della struct sono intrinsecamente "anonimi", un caso notevole è il "newtype" (struttura tuple con un campo) in cui si sta solo avvolgendo un tipo interno.
In tal caso, la denominazione del campo interno non fornisce alcuna informazione aggiuntiva.
struct Inches { inner: i32 }
vs
struct Inches(i32)
Il section on structs on the Rust book ha più informazioni Newtype.
- 1. Quali sono le strutture dati probabilistiche?
- 2. Quali sono le grandi strutture web oggi?
- 3. Quali sono alcuni casi di utilizzo comune per l'utilizzo di Akka Microkernel?
- 4. Quali sono le ragioni ID GCM non è disponibile in alcuni casi in Android
- 5. Quali sono i diversi tipi di casi?
- 6. Quali sono i casi d'uso corretti per process.nextTick in Node.js?
- 7. Quali sono i casi di utilizzo reale del curry?
- 8. Quali sono i casi d'uso per __new__ di Python?
- 9. Quali casi d'uso per OWL?
- 10. Quali sono alcuni usi intelligenti di LINQ?
- 11. Quali sono alcuni casi d'uso di quando `delete` è stato molto utile in JavaScript?
- 12. Quali sono alcuni buoni tutorial di Wireshark?
- 13. Quali sono alcuni script di shell interessanti?
- 14. Quali sono alcuni esempi di interfacce Go?
- 15. Quali sono alcuni usi validi per spEL (Spring Expression Language)?
- 16. Quali sono alcuni suggerimenti per il debug di Objective-c?
- 17. quali sono i casi d'uso per std :: unique_lock :: release?
- 18. Quali sono i casi d'uso per i Web Worker?
- 19. Quali sono i possibili casi di utilizzo di AOP?
- 20. Quali sono alcuni usi delle chiusure per OOP?
- 21. Quali sono alcuni usi dei metadati Clojure?
- 22. Quali sono alcuni usi legittimi specifici per i singleton?
- 23. Quali strutture di dati dell'albero javascript sono disponibili?
- 24. Quali sono alcuni motivi per cui jquery .focus() non funziona?
- 25. Quali sono alcuni usi interessanti per gli agenti Java?
- 26. Quali sono alcuni comuni algoritmi di messa a fuoco?
- 27. Quali strutture dati sono disponibili nel kernel Linux
- 28. Quali sono le fortune?
- 29. Quali sono alcuni esempi di utilizzo di Datagrid di WPF?
- 30. Quali sono alcuni algoritmi per confrontare come sono simili due stringhe?
Un altro caso d'uso è un vettore matematico di piccole dimensioni. Come in una libreria di elaborazione vettoriale 2D o 3D. Anche se potresti anche usare un newtype per un array lì. –