mirror of
https://github.com/ahgamut/rust-ape-example.git
synced 2024-09-20 18:40:15 +00:00
47 lines
1.1 KiB
Rust
47 lines
1.1 KiB
Rust
|
// ./src/generics/bounds.md
|
||
|
|
||
|
|
||
|
// A trait which implements the print marker: `{:?}`.
|
||
|
use std::fmt::Debug;
|
||
|
|
||
|
trait HasArea {
|
||
|
fn area(&self) -> f64;
|
||
|
}
|
||
|
|
||
|
impl HasArea for Rectangle {
|
||
|
fn area(&self) -> f64 { self.length * self.height }
|
||
|
}
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
struct Rectangle { length: f64, height: f64 }
|
||
|
#[allow(dead_code)]
|
||
|
struct Triangle { length: f64, height: f64 }
|
||
|
|
||
|
// The generic `T` must implement `Debug`. Regardless
|
||
|
// of the type, this will work properly.
|
||
|
fn print_debug<T: Debug>(t: &T) {
|
||
|
println!("{:?}", t);
|
||
|
}
|
||
|
|
||
|
// `T` must implement `HasArea`. Any type which meets
|
||
|
// the bound can access `HasArea`'s function `area`.
|
||
|
fn area<T: HasArea>(t: &T) -> f64 { t.area() }
|
||
|
|
||
|
fn part0() {
|
||
|
let rectangle = Rectangle { length: 3.0, height: 4.0 };
|
||
|
let _triangle = Triangle { length: 3.0, height: 4.0 };
|
||
|
|
||
|
print_debug(&rectangle);
|
||
|
println!("Area: {}", rectangle.area());
|
||
|
|
||
|
//print_debug(&_triangle);
|
||
|
//println!("Area: {}", _triangle.area());
|
||
|
// ^ TODO: Try uncommenting these.
|
||
|
// | Error: Does not implement either `Debug` or `HasArea`.
|
||
|
}
|
||
|
|
||
|
pub fn main() {
|
||
|
part0();
|
||
|
}
|
||
|
|