今天我们来学习关于“Rust中Struct的用法是什么,可以做什么”的内容,下文有详解方法和实例,内容详细,逻辑清晰,有需要的朋友可以参考,希望大家阅读完这篇文章后能有所收获,那么下面就一起来了解一下吧。
Structs是RUST中比较常见的自定义类型之一,又可以分为StructStruct,TupleStruct,UnitStruct三个类型,结合泛型、Trait限定、属性、可见性可以衍生出很丰富的类型。
1.定义
pub struct User
{
user_id : u32,
user_name: String,
is_vip : bool,
}
2.实例化
这里初始化必须全部给所有的成员赋值,不像C++,可以单独初始化某个值
let user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};
简化赋值,结构体里的字段与声明赋值字段相同时可以省略字段名,后面的字面值不一样,所以必须指定字段名
let user_id : u32 = 101;
let user_name = "matting".to_string();
let vip = true;
let user2:User = User { user_id, user_name, is_vip:vip};
3.获取值
let user_name = user.user_name;
4.可变访问,必须声明成可变的结构体才能可变访问,结构体里的所有元素都是可变的。
let mut user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};
user.user_name = "matt45m".to_string();
5.更新语法,基于某个实例创建一个新实例的时候,可以使用更新语法。…user代表后面的两个字段的值来自第一个结构体
let mut user : User = User { user_id: 100, user_name: "matt".to_string(), is_vip: false};
let user_id : u32 = 101;
let user2:User = User { user_id, ..user};
6.Tuple struct
Tuple struct 整体有指定的名字,但里面的元素没有名字。
struct Color(u8,u8,u8);
let black = Color(0,0,0);
7.struct的方法(rust的struct类似于c++的类)
impl StructName {}
pub struct SlotNode
{
user_name :String,
start_node : u32,//开始节点
end_node : u32,//结束节点
}
impl SlotNode
{
pub fn new() -> Self
{
SlotNode { user_name: String::new(), start_node: 0, end_node: 1024}
}
pub fn get_end_node(&self) -> u32
{
self.end_node
}
}
let slot_node = SlotNode::new();
println!("{}\n", slot_node.get_end_node());
8.struct继承
rust struct的继承没有于C++那种强大的功能,而且概念上也有很大的差异,其实并不算传统意义上的继承。
// 定义一个类似于父类的结构体
#[derive(Debug)]
struct Animal
{
gender: String,
}
impl Animal
{
fn new(gender: String) -> Self
{
Self { gender }
}
}
impl Animal
{
pub fn print_gender(&self)
{
println!("Animal {}", self.gender);
}
fn set_gender(&mut self, gender: String)
{
self.gender = gender;
}
}
// 定义子类
#[derive(Debug)]
struct Cat
{
animal: Animal,
name: String,
}
impl Cat
{
fn new(animal: Animal, name: &str) -> Self
{
Self { animal , name: name.to_string()}
}
}
impl Cat
{
fn as_animal(&self) -> &Animal
{
&self.animal
}
fn as_mut_animal(&mut self) -> &mut Animal
{
&mut self.animal
}
}
fn main() {
let student = Animal::new("male".to_string());
let mut tome = Cat ::new(student, "小橘");
tome.animal.print_gender();
tome.animal.set_gender("femininity".to_string());
tome.animal.print_gender();
println!("{:#?}", tome);
let a: &Animal = tome.as_animal();
a.print_gender();
let a: &mut Animal = tome.as_mut_animal();
a.set_gender("femininity".to_string());
a.print_gender();
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
长按识别二维码并关注微信
更方便到期提醒、手机管理