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

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

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

2. rust 定义类

2. 1 rust 定义类成员变量

利用结构体(struct)定义成员变量

// 利用结构体定义成员变量
struct Fruit {
    color: String,
    weight: f32
}
  • 1
  • 2
  • 3
  • 4
  • 5

2.2. rust 定义类成员方法

利用impl关键字来定义结构体成员方法

// 利用impl关键字来定义结构体成员方法
impl Fruit {
    fn printInfo(&self) {
        println!("{},{}",self.color,self.weight);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

问题来了,一般定义类前面都会有个关键字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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

为什么在定义类方法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;
}
  • 1
  • 2
  • 3
  • 4

利用struct定义一个类

// 具体类
struct Circle {
    r: f64
}
  • 1
  • 2
  • 3
  • 4

让【具体类】实现【接口】

impl Area for Circle {
    fn area(&self) -> f64 {
        (3.14 * self.r) // 作为返回值 => 必须使用 () 括起来,并不能写 ;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

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());
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI周红伟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值