广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >解析rust中的struct
  • 584
分享到

解析rust中的struct

2024-04-02 19:04:59 584人浏览 八月长安
摘要

目录定义struct实例化struct取得struct里面的某个值struct作为函数的放回值字段初始化简写struct更新语法tuple structUnit-Like Struc

定义struct

  • 使用struct关键字,并为整个struct命名
  • 在花括号内,为所有字段(field)定义名称和类型
struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

实例化struct

  • 想要使用struct,需要创建strut的实例
  • 为每个字段知道具体值
  • 无需按声明的顺序进行指定
struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main(){
    let user1 = User{
        username: String::from("xxxx"),
        email: String::from("xxxx@163.com"),
        active: true,
        sign_in_count:556,
    };
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

取得struct里面的某个值

使用点标记法

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main(){
    let mut user1 = User{
        username: String::from("xxxx"),
        email: String::from("xxxx@163.com"),
        active: true,
        sign_in_count:556,
    };
    // 注意 user1 必须是可变的 
    user1.username = String::from("hhhhhhh");
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

注意

一旦struct的实例是可变的,那么实例中的所有字段都是可以变的

struct作为函数的放回值

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn build_user(email: String, username: String)-> User{
    User{
        email: email,
        username: username,
        active: true,
        sign_in_count:1,
    }
}

fn main(){
    let email = String::from("xxxx@163.com");
    let username = String::from("llllll");
    let user1 = build_user(email, username);
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

字段初始化简写

当字段名与字段值对应变量名相同时,就可以使用字段初始化简写的方式

fn build_user(email: String, username: String)-> User{
    User{
        email,
        username,
        active: true,
        sign_in_count:1,
    }
}

struct更新语法

当你想基于某个struct实例来创建一个新实例的时候,可以使用struct更新语法

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn build_user(email: String, username: String)-> User{
    User{
        email,
        username,
        active: true,
        sign_in_count:1,
    }
}

fn main(){
    let email = String::from("xxxx@163.com");
    let username = String::from("llllll");
    let user1 = build_user(email, username);
    // user2 email 重新赋值
    // user2 其他变量 使用 user1 的值
    // String 类型会被引用 从而失效
    let user2 = User{
        email: String::from("user2@163.com"),
        ..user1
    };
    // user1.username 被 user2.username 引用 从而失效
    // println!("username:{}", user1.username);
    println!("username:{}", user2.username);
    println!("email:{}", user1.email);
    println!("email:{}", user2.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

tuple struct

  • 可定义类似tuple的struct,叫做tuple struct
  • tuple struct 整体有个名,但里面的元素没有名
  • 适用:想给整个tuple起名,并且它不同于其它tuple,而且又不需要给每个元素
  • 定义tuple struct:使用struct关键字,后边是名字,以及里面元素的类型
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 2, 3);
let origin = Point(3, 2, 3);

Unit-Like Struct(没有任何字段)

  • 可以定义没有任何的struct,叫做Unit-Like struct(因为与{},单元类型类似)
  • 使用与需要在某个类型上失效某个trait,但是在里面有没有想要存储的数据结构

struct数据的所有权

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}
  • 这里的字段使用了String而不是&str
  • 改struct实例拥有其所有的数据
  • 只有struct实例是有效的,那么里面的字段也是有效的
  • struct里面也是存放引用,但是需要使用生命周期

什么事struct

  • std::fmt::Display
  • std::fmt::Debug
  • #[derive(Debug)]
  • {:?}
  • {:#?}
#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
fn main(){
    let rect = Rectangle{
        width: 22,
        length: 44,
    };
    println!("{}", area(&rect));
    println!("{:?}", rect);
    println!("{:#?}", rect);
}
fn area(rect: &Rectangle)-> u32{
    rect.length * rect.width
}

struct的方法

  • 方法和函数类似:fn关键字、名称、参数、返回值
  • 方法与函数不同之处
  • 方法是在struct(或enum、trait对象)的上下文中定义
  • 第一个参数是self,表示方法被调用的struct实例

定义方法

#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
impl Rectangle{
    fn area(&self)-> u32{
        self.width * self.length
    }
}
fn main(){
    let rect = Rectangle{
        width: 33,
        length: 44,
    };
    println!("{}", rect.area());
    println!("{:#?}", rect);
}
  • 在impl块里定义方法
  • 方法的第一个参数可以是&self,也可以获得其所有权或可变借用。其他参数一样。
  • 更良好的代码组织。

​​​​​​​​​​​​​​方法调用的运算符

  • C/C++:object->somthing()和(*object).something()一样
  • rust没有->运算符
  • rust会自动引用或解引用
  • 在调用方法时就会发生这种行为
  • 在调用方法时,rust根据情况自动添加&、&mut或*,以便object可以匹配方法的签名。
  • 下面两行代码效果相同
p1.distance(&p2);
(&p1).distance(&p2);

关联函数

  • 可以在impl块里定义不把self作为第一个参数的函数,它们叫做关联函数(不是方法)
String::from();
  • 关联函数通常用于构造器
  • ::符号
  • 关联函数
  • 模块创建的命名空间
#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
impl Rectangle{
    fn square(width: u32, length: u32)->Rectangle{
        Rectangle{
            width,
            length,
        }
    }
}
fn main(){
    let rect = Rectangle::square(33, 11);
    println!("width:{}", rect.width);
    println!("length:{}", rect.length);
    println!("{:#?}", rect);
}

多个impl块

  • 每个struct运行拥有多个impl块

到此这篇关于解析rust中的struct的文章就介绍到这了,更多相关rust struct内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 解析rust中的struct

本文链接: https://www.lsjlt.com/news/168927.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 解析rust中的struct
    目录定义struct实例化struct取得struct里面的某个值struct作为函数的放回值字段初始化简写struct更新语法tuple structUnit-Like Struc...
    99+
    2022-11-13
  • 解析Rust struct 中的生命周期
    最近在用rust 写一个redis的数据校验工具。redis-rs中具备 redis::ConnectionLike trait,借助它可以较好的来抽象校验过程。在开发中,不免要定义...
    99+
    2022-11-13
  • Golang中struct{}和struct{}{}的区别解析
    目录struct {}struct {} {}使用场景举例首先说下Golang中的结构体,结构体是由一系列具有相同类型或不同类型的数据构成的数据集合,Golang中使用关键字stru...
    99+
    2023-03-19
    go struct{}和struct{}{}的区别 go struct
  • rust的package,crate,module示例解析
    目录package,crate,modulecratepackage模块 Module引用module路径super创建公有的结构体和枚举use创建惯用的 use 路径使用 pub ...
    99+
    2023-05-15
    rust的package crate module rust package crate
  • 详解Rust中的workspace
    目录一、目录结构二、子crata中的Cargo.toml声明三、代码引用3.1 model/src/lib.rs3.2 view/src/lib.rs3.3 controller/s...
    99+
    2022-11-13
  • Rust中变量的示例分析
    这篇文章给大家分享的是有关Rust中变量的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。01 变量和绑定变量指定了某存储单元(Memory Location)的名称,该存...
    99+
    2022-10-19
  • 详解Rust中的方法
    目录Rust中的方法方法的简单概念定义方法Rust自动引用和解引用带参数的方法小结Rust中的方法 方法其实就是结构体的成员函数,在C语言中的结构体是没有成员函数的,但是Rust毕竟...
    99+
    2022-11-13
    Rust中的方法 Rust方法
  • Go语言struct要使用 tags的原因解析
    目录struct tags 的使用使用反引号避免使用空格避免重复使用标准化的 tag 名称多个 tag 值struct tags 的原理struct tags 的优势常用的 stru...
    99+
    2023-03-11
    Go 语言struct使用 tags struct tags 使用
  • Rust中的Copy和Clone对比分析
    目录1.Copy和Clone2. Copytrait3. Clonetrait4. Copy和Clonetrait之间的区别1.Copy和Clone R...
    99+
    2023-05-17
    Rust中的Copy和Clone Rust Copy Clone区别
  • Rust连接SQLite数据库的过程解析
    使用 Rust 语言连接操作 SQLite 数据库,我使用 rusqlite 这个 crate。 看例子: 首先,使用 cargo 创建一个 Rust 项目,然后添加依赖 rusql...
    99+
    2022-11-13
  • python中的struct
    我们知道python只定义了6种数据类型,字符串,整数,浮点数,列表,元组,字典。但是C语言中有些字节型的变量,在python中该如何实现呢?这点颇为重要,特别是要在网络上进行数据传输的话。python提供了一个struct模块来提供转换。...
    99+
    2023-01-31
    python struct
  • Rust 中 Deref Coercion讲解
    目录0x00 前言0x01 Deref Trait0x03 Option 中的 as_deref()参考文档0x00 前言 写这个文档的初衷是...
    99+
    2022-11-13
    Rust  Deref Coercion
  • Rust中Cargo的使用详解
    目录1、cargo简介2、使用cargo创建项目2.1、关于Cargo.toml2.2 、关于src/main.rs3、构建Cargo项目4、构建并运行Cargo项目5、检查代码是否...
    99+
    2022-11-16
    Rust Cargo使用 Rust之Cargo
  • c# Struct的一些问题分析
    目录与类的区别:Struct的理论看过好一些,可是工作上基本没有应用过,Class倒处处都有。难道Struct就没有什么使用价值吗?搜了一下如何在类和结构中做出选择? Ϩ...
    99+
    2022-11-12
  • Golang中struct{}和struct{}{}的区别是什么
    今天小编给大家分享一下Golang中struct{}和struct{}{}的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-07-05
  • C#中struct与class的区别详解
    目录1.最大的区别2.struct成员无法被声明为protected。3.struct是隐式的sealed类4.struct中无法重载默认构造函数5.关于对象的初始化6.结构体没有析...
    99+
    2022-11-13
  • 怎么理解golang中的struct操作
    这篇文章主要讲解了“怎么理解golang中的struct操作”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解golang中的struct操作”吧!struct是实现面向对象的重要技术,...
    99+
    2023-06-25
  • Rust中的函数指针详解
    目录什么是函数指针如何在Rust中定义和使用函数指针函数指针与闭包的区别函数指针的应用场景函数指针的优缺点什么是函数指针 通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型...
    99+
    2023-05-18
    rust中的指针 rust 指针 rust 指针数组
  • C++中的struct和class的区别详解
    目录1. C++的struct和class的区别1.1 成员访问范围的差异structclass1.1 继承关系访问范围的差异struct : structstruct : clas...
    99+
    2022-11-13
    C++中的struct C++中的class struct和class的区别
  • 详解Rust中的所有权机制
    目录Rust中的所有权机制什么是所有权所有权规则String类型内存与分配移动克隆所有权与函数引用与借用可变引用悬垂引用引用的规则Slice类型(切片)字符串切片其他类型的 slic...
    99+
    2022-11-13
    Rust所有权机制 Rust所有权
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作