2022-12-21 16:36:30 +01:00
# Tuple Structs
If the field names are unimportant, you can use a tuple struct:
```rust,editable
struct Point(i32, i32);
fn main() {
let p = Point(17, 23);
println!("({}, {})", p.0, p.1);
}
```
This is often used for single-field wrappers (called newtypes):
```rust,editable,compile_fail
2023-05-05 08:57:44 +01:00
struct PoundsOfForce(f64);
2022-12-21 16:36:30 +01:00
struct Newtons(f64);
2023-05-05 08:57:44 +01:00
fn compute_thruster_force() -> PoundsOfForce {
2022-12-21 16:36:30 +01:00
todo!("Ask a rocket scientist at NASA")
}
fn set_thruster_force(force: Newtons) {
// ...
}
fn main() {
let force = compute_thruster_force();
set_thruster_force(force);
}
```
2023-01-23 11:38:37 +00:00
< details >
2023-02-13 07:31:15 -08:00
* Newtypes are a great way to encode additional information about the value in a primitive type, for example:
2023-01-23 11:38:37 +00:00
* The number is measured in some units: `Newtons` in the example above.
2023-10-22 17:13:39 +03:00
* The value passed some validation when it was created, so you no longer have to validate it again at every use: `PhoneNumber(String)` or `OddNumber(u32)` .
2023-02-13 07:31:15 -08:00
* Demonstrate how to add a `f64` value to a `Newtons` type by accessing the single field in the newtype.
* Rust generally doesn’t like inexplicit things, like automatic unwrapping or for instance using booleans as integers.
2023-06-18 05:37:57 -07:00
* Operator overloading is discussed on Day 3 (generics).
* The example is a subtle reference to the [Mars Climate Orbiter ](https://en.wikipedia.org/wiki/Mars_Climate_Orbiter ) failure.
2023-01-23 11:38:37 +00:00
< / details >