Rust by Example - страница 8

стр.

Constants can also be created via the const and static keywords.

There are three types of structures ("structs") that can be created using the struct keyword:

   • Tuple structs, which are, basically, named tuples.

   • The classic C structs

   • Unit structs, which are field-less, are useful for generics.

>#[derive(Debug)]

>struct Person {

>name: String,

>age: u8,

>}

>// A unit struct

>struct Unit;

>// A tuple struct

>struct Pair(i32, f32);

>// A struct with two fields

>struct Point {

>x: f32,

>y: f32,

>}

>// Structs can be reused as fields of another struct

>#[allow(dead_code)]

>struct Rectangle {

>// A rectangle can be specified by where the top left and bottom right

>// corners are in space.

>top_left: Point,

>bottom_right: Point,

>}

>fn main() {

>// Create struct with field init shorthand

>let name = String::from("Peter");

>let age = 27;

>let peter = Person { name, age };

>// Print debug struct

>println!("{:?}", peter);

>// Instantiate a `Point`

>let point: Point = Point { x: 10.3, y: 0.4 };

>// Access the fields of the point

>println!("point coordinates: ({}, {})", point.x, point.y);

>// Make a new point by using struct update syntax to use the fields of our

>// other one

>let bottom_right = Point { x: 5.2, ..point };

>// `bottom_right.y` will be the same as `point.y` because we used that field

>// from `point`

>println!("second point: ({}, {})", bottom_right.x, bottom_right.y);

>// Destructure the point using a `let` binding

>let Point { x: top_edge, y: left_edge } = point;

>let _rectangle = Rectangle {

>// struct instantiation is an expression too

>top_left: Point { x: left_edge, y: top_edge },

>bottom_right: bottom_right,

>};

>// Instantiate a unit struct

>let _unit = Unit;

>// Instantiate a tuple struct

>let pair = Pair(1, 0.1);

>// Access the fields of a tuple struct

>println!("pair contains {:?} and {:?}", pair.0, pair.1);

>// Destructure a tuple struct

>let Pair(integer, decimal) = pair;

>println!("pair contains {:?} and {:?}", integer, decimal);

>}

>הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה

>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

   1. Add a function rect_area which calculates the area of a rectangle (try using nested destructuring).

   2. Add a function square which takes a Point and a f32 as arguments, and returns a Rectangle with its lower left corner on the point, and a width and height corresponding to the f32.

The enum keyword allows the creation of a type which may be one of a few different variants. Any variant which is valid as a struct is also valid as an enum.

>// Create an `enum` to classify a web event. Note how both

>// names and type information together specify the variant:

>// `PageLoad != PageUnload` and `KeyPress(char) != Paste(String)`.

>// Each is different and independent.

>enum WebEvent {

>// An `enum` may either be `unit-like`,

>PageLoad,

>PageUnload,

>// like tuple structs,

>KeyPress(char),

>Paste(String),

>// or c-like structures.

>Click { x: i64, y: i64 },

>}

>// A function which takes a `WebEvent` enum as an argument and

>// returns nothing.

>fn inspect(event: WebEvent) {

>match event {

>WebEvent::PageLoad => println!("page loaded"),

>WebEvent::PageUnload => println!("page unloaded"),

>// Destructure `c` from inside the `enum`.

>WebEvent::KeyPress(c) => println!("pressed '{}'.", c),

>WebEvent::Paste(s) => println!("pasted \"{}\".", s),

>// Destructure `Click` into `x` and `y`.

>WebEvent::Click { x, y } => {

>println!("clicked at x={}, y={}.", x, y);

>},

>}

>}

>fn main() {

>let pressed = WebEvent::KeyPress('x');

>// `to_owned()` creates an owned `String` from a string slice.

>let pasted = WebEvent::Paste("my text".to_owned());

>let click = WebEvent::Click { x: 20, y: 80 };

>let load = WebEvent::PageLoad;