Rust 结构体
Rust结构体
- 什么是结构体
- 定义结构体
- 元组结构体(tuple struct)
- C语言风格结构体(C struct)
- 单元结构体(unit struct)
- 创建结构体实例
- 访问实例属性
- 修改结构体实例属性值
- 应用场景
- 1、结构体做参数
- 2、结构体作为返回值
- 结构体方法
- 结构体静态方法
什么是结构体
结构体( struct )可以由各种不同类型组成。使用 struct 关键字来创建。struct 是 structure 的缩写。结构体可以作为另一个结构体的字段。结构体是可以嵌套的。
定义结构体
struct 结构体名称 {字段1:数据类型,字段2:数据类型,...
}
元组结构体(tuple struct)
事实上就是具名元组而已。
struct Color(u8, u8, u8);
struct Point(f64, f64);let black = Color(0, 0, 0);
let origin = Point(0.0, 0.0);
C语言风格结构体(C struct)
struct 结构体名称 {...
}
单元结构体(unit struct)
不带字段,在泛型中很有用。
struct Unit;
创建结构体实例
let 实例名称 = 结构体名称{field1:value1,field2:value2...
};
结构体初始化,其实就是对 结构体中的各个元素进行赋值。
#[derive(Debug)]
struct Person{name: String,addr: String,age: i32,
}fn main() {let s = Person{name: String::from("张三"),addr: String::from("上海浦东"),age: 18,};println!("{:?}", s);
}
访问实例属性
实例名称 . 属性
println!("{}",s.name);//输出 name字段值
修改结构体实例属性值
结构体实例默认是不可修改的,如果想修改结构体实例,声明时使用mut
关键字。
let mut s2 = Person{name: String::from("张三"),addr: String::from("上海浦东"),age: 18,};s2.age=20; // 修改年龄println!("{:?}",s2);
应用场景
1、结构体做参数
fn show(s: Person) {println!("name is :{} addr is {} age is{}",s.name, s.addr, s.age);
}
2、结构体作为返回值
fn get_value(name: String, addr: String, age: i32) -> Person{return Person{name,addr,age,};
}let s3 = get_value(String::from("李四"),String::from("北京"),30,
);
println!("{:?}", s3);
}
结构体方法
方法(method) 是依附于对象的函数。这些方法通过关键字 self
来访问对象中的数据和其他。方法在 impl
代码块中定义。
与函数的区别
函数:可以直接调用,同一个程序不能出现 2 个相同的函数签名的函数,函数不归属任何owner
。
方法:归属某一个owner
,不同的owner
可以有相同的方法签名,类似于c++类方法。
impl 结构体{fn 方法名(&self, 参数列表) 返回值 {//方法体}
}
impl
是 implement 的缩写。意思是 “实现”的意思。
self
是“自己”的意思,&self
表示当前结构体的实例。 &self
也是结构体普通方法固定的第一个参数,其他参数可选。
结构体方法的作用域仅限于结构体内部。
impl Person {fn get_age(&self) -> i32 {return self.age;}
}println!("age={}", s3.get_age());
结构体静态方法
静态方法,无&self
参数。
fn 方法名(参数: 数据类型,...) -> 返回值类型 {// 方法体}
调用方式
结构体名称::
方法名(参数列表)
impl Person {...fn get_value(name: String, addr: String, age: i32) -> Person {return Person{name,addr,age,};}
}let s4 = Person::get_value(String::from("王五"),String::from("上海"),20,
);