09-结构体例子

2022/4/29 23:18:51

本文主要是介绍09-结构体例子,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

结构体例子

计算长方形面积

fn main() {
    let width1 = 30;
    let height1 = 50;

    println!(
        "The area of the rectangle is {} square pixels.",
        area(width1, height1)
    );
}

fn area(width: u32, height: u32) -> u32 {
    width * height        //没有加分号,是表达式,可以返回值
}

但是作为长方形的长和宽却没有关联在一起

使用元组重构

fn main() {
    let rect1 = (30, 50);

    println!(
        "The area of the rectangle is {} square pixels.",
        area(rect1)
    );

}

fn area(dimensions: (u32, u32)) -> u32 {       //函数参数变为元组
    dimensions.0 * dimensions.1
}

将长和宽通过元组组合到了一起,产生了关联

但是可读性变差了,不能知道元组中哪个元素是长,哪个元素是宽

使用结构体重构

struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        area(&rect1)
    );

}

fn area(rectangle: &Rectangle) -> u32 {      //函数参数为对Rectangle这个不可变结构体的借用
    rectangle.width * rectangle.height       //即借用结构体而不是获取它的所有权
}                                            //使main函数可以保持对rect1的所有权,可以继续使用它

使用结构体使程序更加清晰易懂

但是不能通过println!宏直接打印结构体,{}默认告诉println!宏使用 std::fmt::Display格式化方法,单因为打印结构体的格式时不明确,要打印逗号吗?大括号呢?结构体并没有提供一个 Display 实现

println!("rect1 is {}", rect1);是不能运行的

通过派生 trait 增加实用功能

但是可以使用{:?}{:#?}指示println! 使用 Debug 的输出格式(std::fmt::Display格式化方法)

Debug是一个 trait,它允许以一种对开发者有帮助的方式打印结构体,以便调试代码时能看到它的值。

但是只在println!中使用Debug是不够的,还要在结构体定义前加上外部属性 #[derive(Debug)],让结构体显式选择Debug的功能

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };
   
     
    println!("rect1 is {:?}", rect1);   
    /*
    输出为
    rect1 is Rectangle { width: 30, height: 50 }
    */
    
    /* 
    println!("rect1 is {:#?}", rect1);
    输出为  (变得更加美观
    rect1 is Rectangle {          
        width: 30,
        height: 50,
    }
    */
}

还可以使用 dbg! 宏实现 Debug 格式打印数值

dbg! 宏接收一个表达式的所有权,打印出代码中调用 dbg! 宏时所在的文件和行号,以及该表达式的结果值,并返回该值的所有权

调用 dbg! 宏会打印到标准错误控制台流(stderr),而println!会打印到标准输出控制台流(stdout

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let scale = 2;
    let rect1 = Rectangle {
        width: dbg!(30 * scale),
        height: 50,
    };

    dbg!(&rect1);

}

输出为

30 * scale = 60 
&rect1 = Rectangle {    
    width: 60,    
    height: 50, 
}


这篇关于09-结构体例子的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程