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?
解释
- impl关键字在struct、enum或者trait对象上实现方法调用语法
- 关联函数 (associated function) 的第一个参数通常为self参数。
有几种变体
- self,允许实现者移动和修改对象,对应的闭包特性为FnOnce
- &self,既不允许实现者移动对象也不允许修改,对应的闭包特性为Fn
- &mut self,允许实现者修改对象但不允许移动,对应的闭包特性为FnMut
- 不含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());
}
源码下载
上一篇: 详解Python自建logging模块