• Rust(16):结构体方法


    Rust 中的方法,具体来讲是结构体类型中的方法,以及结构体的关联函数。

    结构体方法

    在 JS 中,函数和方法是同一个概念,只不过语境不同。一个独立的函数就叫函数,一个对象的成员是一个函数的化,通常称为某某对象的某某方法。

    方法

    Rust 中和 JS 对象相对应的类型叫作结构体。

    Rust 中使用 impl 块为结构体添加一个方法。impl 关键字是 implements 的缩写,实现的意思,表示为结构体实现方法和函数。

    结构体的方法本质上就是函数,使用 fn 关键字来声明,可以接收参数,来执行一段逻辑,并有返回值。方法的第一个参数永远为 &selfself 表示调用该方法的结构体实例,类似于面向对象编程语言中的 this,可以通过 self 关键字访问结构体和其他方法的数据。

    #[derive(Debug)]
    // 定义一个表示平面坐标系上的点的结构体
    struct Point {
        x: u32,
        y: u32,
    }
    
    impl Point {
        // 类似于面向对象编程中对象的实例方法
        // 该方法返回 Point 结构体的 x 坐标
        fn get_x(&self) -> u32 { 
            self.x
        }
    
        // 修改结构体中的数据,需要使用可变引用 &mut
        // 该方法修改 Point 结构体的 x 坐标
        fn set_x(&mut self, x: u32) {
            self.x = x; 
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    访问结构体中的方法使用单点号 .

    fn main() {
        let mut p = Point {10, 10};
        println!("{:?}", p);
    
        println!("{:?}", p.get_x());
    
        p.set_x(20);
        println!("{:?}", p);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    关联函数

    impl 除了能为结构体添加方法外,还能添加关联函数(associated function )。

    关联函数和方法的区别是:

    • 关联函数不用操作结构体的数据,也就不用接收 &self 作为参数
    • 关联函数的调用使用双冒号 ::

    通常会使用关联函数为结构体创建一个构造函数,还是以上面的 Point 结构体为例:

    impl Point {
        // 构造方法
        fn new(x: u32, y: u32) -> Point {
            Point { x, y }
        }
    }
    
    fn main() {
        let p = Point::new(10, 10);
        println!("{:?}", p);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    前面学习字符串类型时,使用 String::from 来创建一个字符串实例,from 就是 String 的关联函数。还可以使用 String::new 创建一个空的字符串实例。

    小结

    本文介绍了 Rust 中函数在不同情境下的使用。本质上函数,方法,关联函数,都是函数。在结构体中函数可以分为方法和关联函数,方法是用来操作结构体数据的,关联函数用来实现和结构体本身无关的逻辑。

  • 相关阅读:
    Redis_05_Lua脚本实现多条Redis命令原子性
    【毕业季】角色转换
    Redisson
    多通道源表测试气体传感器方案
    【openGauss/MogDB的TPCH测试】
    Windows下安装Redis服务
    BD个人总结
    【通信原理】第三章 -- 随机过程[补充]
    18-Java迭代器模式 ( Iterator Pattern )
    Vue 常用修饰符
  • 原文地址:https://blog.csdn.net/Old_Soldier/article/details/127780426