Rust编程语言中的定义类型

简介: Rust编程语言中的定义类型

在Rust中自定义类型有两种方式,其一是定义结构体,其二是定义枚举,通过这两种方式来定义符合实际场景的复杂类型。


结构体的定义和使用


  1. 定义结构体的关键字是 struct
  2. 结构体风格有C-StyleTuple-StyleUnit-Style三种;


1. C-Style普通结构体:

定义:包含两个字段代表“坐标点结构体”;

struct Point {
    x: f32,
    y: f32,
}
复制代码

创建并打印输出Point结构体,并在打印时使用两个{:?}分别代码PointX和PointY;

let point = Point { x: 10.23, y: 29.39 };
println!("Point x {:?},y{:?}", point.x, point.y);
// output:Point x 10.23,y29.39
复制代码


2. 定义结构体的字段为另一个结构体:

定义:包含起点和终点两个坐标点的“线结构体”;

struct Line {
    start: Point,
    end: Point,
}
复制代码

创建并打印输出Line结构体,在创建时用到了解构来简化使用,在输出时使用具名的方式来指定输出的内容;

let Line { start, end } = Line {
    start: Point { x: 0.00, y: 0.00 },
    end: Point { x: 100.00, y: 0.00 },
};
println!(
    "Line start{startX:?}{startY:?},end{endX:?}end{endY:?}",
    startX = start.x,
    startY = start.y,
    endX = end.x,
    endY = end.y,
);
// output:Line start0.00.0,end100.0end0.0
复制代码


3. Tuple-Style结构体:

定义:包含原点和半径的“环结构体”,其中元祖的主要特点就是可以将不同类型的数据装到一起;

struct Ring(Point, Line);
复制代码

创建并打印Ring结构体;

let Ring(_point, _line) = Ring(point, Line { start, end });
println!(
    "Ring {pointX:?} {pointY:?},start{startX:?} {startY:?},end{endX:?} {endY:?}",
    pointX = _point.x,
    pointY = _point.y,
    startX = _line.start.x,
    startY = _line.start.y,
    endX = _line.end.x,
    endY = _line.end.y,
);
// output:Ring 10.23 29.39,start0.0 0.0,end100.0 0.0
复制代码


4. Unit-Style单元结构体

定义和创建:特点就是没有字段所以可以在需要实现一个特性但不想存储类型本身的任何数据时使用;

struct Empty;
let x = Empty;
println!("{:p}", &x);
// output:0xca675df588
复制代码


枚举的定义和使用


定义枚举:Rust中枚举的类型由一个或多个的普通结构体,元祖结构体或单元结构体组成;

enum WebEvent {
    PageLoad,                 // 单元结构体
    KeyPress(char),           // 元祖结构体
    Click { x: i64, y: i64 }, // 普通C-Style结构体
}
复制代码

使用别名:通过使用type关键字定义的别名来简化后续的使用;

type WE = WebEvent;
复制代码

匹配枚举:使用match来匹配后做对应处理,同时使用了use简化代码

fn inspect(event: WE) {
    // 通过use简化
    use WebEvent::{Click, KeyPress, PageLoad};
    // 匹配后做对应处理
    match event {
        PageLoad => println!("PageLoad"),
        KeyPress(c) => println!("KeyPress:{}", c),
        Click { x, y } => {
            println!("x:{}, y:{}", x, y);
        }
    }
}
// 执行定义的函数,当定义的字段存在没有使用的情况,可以通过在文件顶部键入`#![allow(dead_code)]`来忽略编译的错误警告
inspect(WebEvent::PageLoad);
inspect(WebEvent::KeyPress('a'));
inspect(WebEvent::Click { x: 100, y: 200 });
复制代码


总结:


     本篇有点水了,总结了一下Rust编程语言的自定义类型的方式,主要是一些指针语法实在有点拗,下次注意~



相关文章
|
4天前
|
Rust 安全 Java
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第27天】Rust语言以其独特的特性和优势在编程领域迅速崛起。本文介绍Rust的核心特性,如所有权系统和强大的并发处理能力,以及其性能和安全性优势。通过实战示例,如“Hello, World!”和线程编程,帮助读者快速入门Rust。
14 1
|
5天前
|
Rust 安全 编译器
编程语言新宠:Rust语言的特性、优势与实战入门
【10月更文挑战第26天】Rust语言诞生于2006年,由Mozilla公司的Graydon Hoare发起。作为一门系统编程语言,Rust专注于安全和高性能。通过所有权系统和生命周期管理,Rust在编译期就能消除内存泄漏等问题,适用于操作系统、嵌入式系统等高可靠性场景。
15 2
|
12天前
|
Rust 安全 开发工具
探索 Rust:系统编程语言的新纪元
【10月更文挑战第17天】介绍了 Rust 语言的核心特性,如内存安全、强大的并发编程模型和接近 C/C++ 的性能。文章还涵盖了 Rust 的开发工具,如 Cargo 和 Rustup,以及其在业界的应用,包括微软 Azure 和 Firefox 浏览器。Rust 正在成为系统编程领域的新星,为开发者带来高性能和安全性。
|
1月前
|
Rust 安全 Java
软件工程师,是时候了解下Rust编程语言了
2024年年初,美国政府发布了一份网络安全报告,呼吁软件开发人员停止使用容易出现内存安全漏洞的编程语言,比如:C和C++,转而使用内存安全的编程语言。这份报告由美国网络空间总监办公室 (ONCD) 发布,旨在落实美国总统拜登的网络安全战略,目标是“保护网络空间的基石”。 内存安全指的是程序在访问内存时,能够避免出现错误和漏洞,比如:缓冲区溢出、野指针等。Java由于其运行时错误检测机制,被认为是一种内存安全的语言。然而,C和C++允许直接操作内存地址,并且缺乏边界检查,容易出现内存安全问题。
70 10
|
2月前
|
Rust 安全 Java
探索 Rust:系统编程语言的新纪元
Rust 是一种由 Mozilla 研究院开发的开源系统编程语言,以其内存安全、高性能和现代并发工具著称,已连续多年被评为 Stack Overflow 最受喜爱的编程语言。Rust 通过所有权系统和借用检查等机制确保内存安全,并具备无垃圾回收、强大类型系统及高效并发编程特性。它广泛应用于系统级应用、WebAssembly、区块链技术和游戏开发等领域。Rust 提供丰富的学习资源和开发工具,包括官方文档、书籍、Cargo 包管理器和活跃社区支持,正逐渐成为系统编程领域的新力量。
|
2月前
|
设计模式 Rust 安全
30天拿下Rust之高级类型
30天拿下Rust之高级类型
23 0
|
3月前
|
Rust 安全 编译器
编程语言的演变:从C到Rust的技术探索
【8月更文挑战第14天】从C语言到Rust语言的演变是编程语言发展历程中的一个重要篇章。这一演变不仅体现了编程语言的不断进步和发展,也为我们展示了编程语言的无限可能性和广阔前景。
|
3月前
|
机器学习/深度学习 Rust 编译器
神秘编程语言 Rust 背后究竟隐藏着怎样的生态宝藏?框架、工具链与社区资源大揭秘!
【8月更文挑战第31天】Rust 语言凭借卓越性能与内存安全性吸引了众多开发者。其生态系统包括多种框架(如 Actix-web、Rocket 和 Warp)、强大的工具链(如包管理器 Cargo 和高效编译器)以及丰富的社区资源。Cargo 简化了项目管理,编译器提供详尽错误信息并支持增量编译,而活跃的社区则为学习与交流提供了广阔平台,涵盖官方文档、博客、论坛及大量 GitHub 开源项目。随着更多开发者的加入,Rust 生态系统将持续繁荣发展。
60 0
|
4月前
|
Rust 安全 程序员
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
Rust与C++的区别及使用问题之Rust解决多线程下的共享的问题如何解决
|
4月前
|
JavaScript Java 开发者
Rust 问题之在众多编程语言中关于内存管理有哪些分类
Rust 问题之在众多编程语言中关于内存管理有哪些分类