2015-05-20 16 views
11

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?

+3

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ì. –

risposta

28

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.

Problemi correlati