欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rust 面向对象之Struct、impl、trait关键字使用

程序员文章站 2022-07-04 23:49:07
...

1. 前言

rust语言跟C、C++是一个性能级别的语言,在用法上要比C++简单很多。例如:要实现一个web服务,RUST可以通过包管理工具直接安装一个HTTP库,然后使用。而C++则需要手动下载,手动导入相应的文件等等。
总的而言rust是非常值得学习的一门语言,根据项目的不同需求,不同的性能,灵活应用不同的语言。

2. rust 定义类

2. 1 rust 定义类成员变量

利用结构体(struct)定义成员变量
// 利用结构体定义成员变量
struct Fruit {
    color: String,
    weight: f32
}
2.2. rust 定义类成员方法
利用impl关键字来定义结构体成员方法
// 利用impl关键字来定义结构体成员方法
impl Fruit {
    fn printInfo(&self) {
        println!("{},{}",self.color,self.weight);
    }
}
2.3. 完整代码
// 利用结构体定义成员变量
struct Fruit {
    color: String,
    weight: f32
}
// 利用impl关键字来定义结构体成员方法
impl Fruit {
    fn printInfo(&self) {
        println!("{},{}",self.color,self.weight);
    }
}
// 调用
fn main() {
    let f = Fruit{color:String::from("green"), weight:12.5};
    f.printInfo();
}

问题来了,一般定义类前面都会有个关键字new,那么这个该怎么实现呢?看下面的例子。

3. rust 定义标准类

// 利用结构体定义成员变量
struct Fruit {
    color: String,
    weight: f32
}
// 利用impl关键字来定义结构体成员方法
impl Fruit {
    // 相当于方法Fruit::new()调用
    fn new(color: String,weight:f32) -> Fruit {
        Fruit {
            color: color,
            weight: weight
        }
    }
    fn printInfo(&self) {
        println!("{},{}",self.color,self.weight);
    }
}
// 调用
fn main() {
    let f = Fruit::new(String::from("green"), 12.5);
    f.printInfo();
}

为什么在定义类方法printInfo(&self)里面传的参数是&self?

解释
  1. impl关键字在struct、enum或者trait对象上实现方法调用语法
  2. 关联函数 (associated function) 的第一个参数通常为self参数。
有几种变体
  1. self,允许实现者移动和修改对象,对应的闭包特性为FnOnce
  2. &self,既不允许实现者移动对象也不允许修改,对应的闭包特性为Fn
  3. &mut self,允许实现者修改对象但不允许移动,对应的闭包特性为FnMut
  4. 不含self参数的关联函数称为静态方法 (static method)

4. rust 接口定义

利用trait关键字定义一个接口
// 接口
trait Area {
    fn area(&self) -> f64;
}
利用struct定义一个类
// 具体类
struct Circle {
    r: f64
}
让【具体类】实现【接口】
impl Area for Circle {
    fn area(&self) -> f64 {
        (3.14 * self.r) // 作为返回值 => 必须使用 () 括起来,并不能写 ;
    }
}
5. 完整代码
// 接口
trait Area {
    fn area(&self) -> f64;
}

// 具体类
struct Circle {
    r: f64
}

// 让【具体类】实现【接口】
impl Area for Circle {
    fn area(&self) -> f64 {
        (3.14 * self.r) // 作为返回值 => 必须使用 () 括起来,并不能写 ;
    }
}

fn main()
{
    let r = Circle {r:10.5};
    println!("area = {:?}", r.area());
}

源码下载

源码下载地址

相关标签: Rust