Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What are some use cases for tuple structs?

Tags:

rust

The Rust book mentions that "it is almost always better to use a struct than a tuple struct." Other than the newtype pattern, are there any other advantages of having unnamed fields? Seems to me like the newtype pattern is the only useful case of having tuple structs.

like image 935
Anthony Calandra Avatar asked May 20 '15 03:05

Anthony Calandra


People also ask

Why use a tuple instead of a struct?

You use a struct for things that meaningfully belong together to form a whole. You use a tuple for things that are together coincidentally. You can use a tuple spontaneously in your code.

What is a tuple struct?

When you're just learning, the difference is simple: a tuple is effectively just a struct without a name, like an anonymous struct. This means you can define it as (name: String, age: Int, city: String) and it will do the same thing as the following struct: struct User { var name: String var age: Int var city: String }

Are tuples good C++?

Tuples give very good flexibility for creating a collection of different or same data types. In a class, we can access a data member or function using its name. However, in a tuple we use get<index> helper function for the same.


1 Answers

They are very similar to each other.

Given the following definitions

struct TupleStruct(i32, i32); struct NormalStruct {     a: i32,     b: i32, } 

we can construct instances of structs and tuple structs as follows

let ts = TupleStruct(1, 2); let ns = NormalStruct { a: 1, b: 2 };  // shortcut to initialize the fields of a struct using the values of the // fields of another struct let ns2 = NormalStruct { a: 5, ..ns }; let ts2 = TupleStruct { 0: 1, ..ts }; // for TupleStruct it needs curly brackets                                       // and implicit field names 

Assignments work as follows

let TupleStruct(x, y) = ts; println!("x: {}, y: {}", x, y);  let NormalStruct { a, b } = ns; println!("a: {}, b: {}", a, b); 

A tuple struct's fields have implicit names (0, 1, ...). Hence, accessing fields is performed as follows

println!("Accessing ns by name - {}{}", ns.a, ns.b); println!("accessing ts by name - {}{}", ts.0, ts.1); 

At least for documentation purposes, it's almost always clearer to assign explicit names to the fields of the struct. That's why in the Rust community I've seen many argue for always using a normal struct.

However, there might be cases where the fields of the struct are inherently "anonymous", one notable case being the "newtype" (tuple struct with one field) where you're only wrapping an inner type.

In that case, naming the inner field does not arguably provide any additional information.

struct Inches {     inner: i32, } 

vs

struct Inches(i32); 

The section on structs on the Rust book has more info on newtypes.

like image 54
Paolo Falabella Avatar answered Oct 04 '22 10:10

Paolo Falabella