#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
fn width(&self) -> bool {
self.width > 0
}
fn square(size: u32) -> Self {
Self {
width: size,
height: size,
}
}
}
pub fn impl_area() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
println!(
"The area of the rectangle is: {} square pixels.",
rect1.area()
);
if rect1.width() {
println!("The rectangle has a nonzero width; it is {}", rect1.width);
}
}
pub fn reference_and_dereference() {
#[derive(Debug, Copy, Clone)]
struct Point {
x: f64,
y: f64,
}
impl Point {
fn distance(&self, other: &Point) -> f64 {
let x_squared = f64::powi(other.x - self.x, 2);
let y_squared = f64::powi(other.y - self.y, 2);
f64::sqrt(x_squared + y_squared)
}
}
let p1 = Point { x: 0.0, y: 0.0 };
let p2 = Point { x: 5.0, y: 6.5 };
let distance = p1.distance(&p2);
println!("distance is {}", distance);
let distance = (&p1).distance(&p2);
println!("distance is {}", distance);
}
pub fn can_hold() {
let rect1 = Rectangle {
width: 30,
height: 50,
};
let rect2 = Rectangle {
width: 10,
height: 40,
};
let rect3 = Rectangle {
width: 60,
height: 45,
};
println!("Can rect1 hold rect2? {}", rect1.can_hold(&rect2));
println!("Can rect1 hold rect3? {}", rect1.can_hold(&rect3));
}
pub fn associated_functions() {
let sq = Rectangle::square(3);
}
impl Rectangle {
fn can_hold(&self, other: &Rectangle) -> bool {
self.width > other.width && self.height > other.height
}
}