rust/src/doc/trpl/structs.md

90 lines
2.0 KiB
Markdown
Raw Normal View History

2015-04-07 21:16:02 -05:00
% Structs
2015-04-18 14:54:33 -05:00
Structs are a way of creating more complex data types. For example, if we were
2015-04-10 09:37:29 -05:00
doing calculations involving coordinates in 2D space, we would need both an `x`
and a `y` value:
```rust
let origin_x = 0;
let origin_y = 0;
```
A struct lets us combine these two into a single, unified datatype:
2015-04-07 21:16:02 -05:00
```rust
struct Point {
x: i32,
y: i32,
}
fn main() {
let origin = Point { x: 0, y: 0 }; // origin: Point
println!("The origin is at ({}, {})", origin.x, origin.y);
}
```
2015-04-18 14:54:33 -05:00
Theres a lot going on here, so lets break it down. We declare a `struct` with
the `struct` keyword, and then with a name. By convention, `struct`s begin with
a capital letter and are camel cased: `PointInSpace`, not `Point_In_Space`.
2015-04-07 21:16:02 -05:00
We can create an instance of our struct via `let`, as usual, but we use a `key:
2015-04-18 14:54:33 -05:00
value` style syntax to set each field. The order doesnt need to be the same as
2015-04-07 21:16:02 -05:00
in the original declaration.
Finally, because fields have names, we can access the field through dot
notation: `origin.x`.
The values in structs are immutable by default, like other bindings in Rust.
Use `mut` to make them mutable:
2015-04-10 09:37:29 -05:00
```rust
2015-04-07 21:16:02 -05:00
struct Point {
x: i32,
y: i32,
}
fn main() {
let mut point = Point { x: 0, y: 0 };
point.x = 5;
println!("The point is at ({}, {})", point.x, point.y);
}
```
This will print `The point is at (5, 0)`.
2015-04-10 09:37:29 -05:00
2015-04-14 12:41:31 -05:00
Rust does not support field mutability at the language level, so you cannot
write something like this:
2015-04-10 09:37:29 -05:00
```rust,ignore
struct Point {
mut x: i32,
y: i32,
}
```
Mutability is a property of the binding, not of the structure itself. If youre
used to field-level mutability, this may seem strange at first, but it
significantly simplifies things. It even lets you make things mutable for a short
time only:
```rust,ignore
struct Point {
x: i32,
y: i32,
}
fn main() {
let mut point = Point { x: 0, y: 0 };
point.x = 5;
2015-04-14 12:41:31 -05:00
let point = point; // this new binding cant change now
2015-04-10 09:37:29 -05:00
2015-04-14 12:41:31 -05:00
point.y = 6; // this causes an error
2015-04-10 09:37:29 -05:00
}
```