Tuple Structs

If the field names are unimportant, you can use a tuple struct:

  1. struct Point(i32, i32);
  2. fn main() {
  3.     let p = Point(17, 23);
  4.     println!("({}, {})", p.0, p.1);
  5. }

This is often used for single-field wrappers (called newtypes):

  1. struct PoundsOfForce(f64);
  2. struct Newtons(f64);
  3. fn compute_thruster_force() -> PoundsOfForce {
  4.     todo!("Ask a rocket scientist at NASA")
  5. }
  6. fn set_thruster_force(force: Newtons) {
  7.     // ...
  8. }
  9. fn main() {
  10.     let force = compute_thruster_force();
  11.     set_thruster_force(force);
  12. }

This slide should take about 10 minutes.

  • Newtypes are a great way to encode additional information about the value in a primitive type, for example:
    • The number is measured in some units: Newtons in the example above.
    • 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).
  • 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.
    • Operator overloading is discussed on Day 3 (generics).
  • The example is a subtle reference to the Mars Climate Orbiter failure.