美文网首页Rust 学习笔记
Rust基础学习-10-结构体的方法

Rust基础学习-10-结构体的方法

作者: 一个游戏开发者 | 来源:发表于2019-10-10 13:07 被阅读0次

这篇博客来聊一下 结构体的方法,本质上就是为某个结构体而定义的方法 (函数)。拿面向对象语言来说,写了一个类,还可能会在这个类里写一些方法,基本上同样的套路。或者说,定义的这些方法,是与这个结构体有关的。

不太严谨的解释,这里所谓的方法,其实就是一个函数。

结构体方法的定义

看下面的代码

// 这里定义一个矩形的结构体
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

// 这里的 impl xxx 是固定的,xxx 就是你要为哪一个结构体去定义一些方法
impl Rectangle {
    // 这是一个计算面积的方法
    fn area(&self) -> u32 {
        self.width * self.height
    }
    
    // 这是一个计算周长的方法
    fn perimeter(&self) -> u32 {
        self.width * 2 + self.height * 2
    }
    
    // 这是一个计算能否包含另一个矩形的方法
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}

!!! 注意看上面的代码及 注释

结构体的方法 第一个参数总是 &self 表示定义好的结构体 实例 自身

下面是使用这个结构体

fn main() {
    let r1 = Rectangle {width: 128, height: 90};
    let r2 = Rectangle {width: 50, height: 30};
    
    println!("{:#?}", r1);
    println!("{:#?}", r2);
    
    // 调用结构体的 area() 方法
    println!("r area: {}", r1.area());
    
    // 调用结构体的 perimeter() 方法
    println!("r perimeter: {}", r1.perimeter());
    
    // 调用结构体的 can_hold() 方法
    println!("r1 can hold r2: {}", r1.can_hold(&r2));
}

注意上面的代码,我们打印结构体实例的时候,以前是用 {:?},而这次用的是 {:#?}。这是因为,使用 {:#?} 能以更美观的方式打印出这个结构体的数据来

如果要定义可以修改的结构体,只要加上 mut 就行,看下面的代码

fn main() {
    let mut r1 = Rectangle {width: 100, height: 50};
    println!("{:#?}", r1);
    
    // 修改了 r1 的 width
    r1.width = 1000;
    println!("{:#?}", r1);
}

关联函数

impl 代码块中,定义一些不以 &self 作为参数的函数,这些函数被称为 关联函数。就是说,这些函数,不针对某一个具体的结构体实例,而是针对这个结构体本身。

直接看下面的代码

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

impl Rectangle {
    // 创建一个 矩形 实例
    fn new(width: u32, height: u32) -> Rectangle {
        Rectangle {
            width,
            height,
        }
    }
    
    // 创建一个 正方形 实例
    fn new_square(size: u32) -> Rectangle {
        Rectangle {
            width: size,
            height: size,
        }
    }
}

下面代码是 使用 关联函数

fn main() {
    let r1 = Rectangle::new(100, 80);
    let r2 = Rectangle::new_square(100);
    println!("{:#?}", r1);
    println!("{:#?}", r2);
}

对于一个结构体方法的调用,我们使用 r1.area() 这样的形式。而对于 关联函数 的调用,需要使用 :: 这个操作符。

相关文章

  • Rust基础学习-10-结构体的方法

    这篇博客来聊一下 结构体的方法,本质上就是为某个结构体而定义的方法 (函数)。拿面向对象语言来说,写了一个类,还可...

  • Rust语言教程(7) - 结构体与方法的结合

    Rust语言教程(7) - 结构体与方法的结合 上一节我们学习了结构体类型,但是只介绍了定义域,并没有介绍定义方法...

  • Rust基础学习-09-结构体的定义

    结构体可以用于组织不同类型的数据,和一些面向对像语言中的 类 是很像的。 这篇博客包含以下内容 结构体的定义 通过...

  • Rust 结构体

    使用结构体组织相关的数据 定义并实例化结构体 定义结构体需要使用struct关键字并为整个结构体提供一个名字。接着...

  • 2020 Rust 入门结构体方法

    最近学习无人驾驶,在无人驾驶中用到最多语言是 cpp 这样相对底层语言。那么我们除了 cpp 现在多了 rust ...

  • rust结构体的使用

    rust的结构体使用有点特别的地方,所有权比较麻烦。结构体的定义比较普通 使用结构体成员name 必须添加clon...

  • Rust语言编程实例100题-050

    Rust语言编程实例100题-050 题目:在 Rust 中,模块 Module 用于将函数或结构体按照功能分组。...

  • Swift Tour Learn (六) -- Swift 语法

    Swift语法基础(五)-- (类和结构体、属性、方法) 本章将会介绍 类和结构体对比结构体和枚举是值类型类是引用...

  • Rust 闭包学习 (Fn/FnMut/FnOnce)

    学习 Rust 闭包记录 闭包作为参数 闭包作为结构体属性 异步使用闭包 主要就是加 Send trait,没加 ...

  • 数据结构与算法分析(2)——指针链表复习

    M小白的学习笔记17/12/05 指针 定义结构体 使用结构体的方法 struct node Node; type...

网友评论

    本文标题:Rust基础学习-10-结构体的方法

    本文链接:https://www.haomeiwen.com/subject/yywopctx.html