复合类型_Rust常用的复合数据类型

a9fdebd04c851376fb00bad91174562a.png

一、数组

1.数组创建

一段连续空间中,存储了同类型的数据。

fn main() {
    let mut arr1 = [0, 1, 2, 3 ,4 ,5];
    let mut arr2 = [1 ; 6]; //创建大小为6,元素都是1的数组
    arr1 = arr2;    //arr和arr2是同大小和同数据类型,在Rust中是同一类型,因此可以相互赋值
    println!("arr1[0]: {}", arr1[0]);
    println!("arr2[0]: {}", arr2[0]);   //复习一下:因为拷贝时是复制语义,因此arr2还在
}

运行结果:

arr1[0]: 1
arr2[0]: 1

为啥这个数组是复制语义,如果还不明白这个问题,需要回上一期看一下哈。

2.一些数组的操作

fn main() {
    let mut arr1 = [0, 1, 2, 3 ,4 ,5];
    let mut arr2 = [1 ; 6]; //创建大小为6,元素都是1的数组
    println!("{:?}", arr1 < arr2);
}

运行结果:

true

上面是数组的比较。

fn main() {
    let mut arr1 = [0, 1, 2, 3 ,4 ,5];
    for i in &arr1 {
        println!("{}", i);
    }
}

运行结果:

0
1
2
3
4
5

数组的遍历。

3.多维数组

fn main() {
    let arr = [[0, 0], [0, 1], [1, 0], [1, 1]];
    for i in &arr {
        println!("{:?}", i);
    }
}

运行结果:

[0, 0]
[0, 1]
[1, 0]
[1, 1]

二、字符串

这里只讲一个程序:

fn main() {
    let mut str1 = String::from("Rust");  //String类型
    push_str1(&mut str1);
    println!("{}", str1);
    let mut str2 = "Rust";  //&str类型,因此并没有所有权
    push_str2(&mut str2);
    println!("{}", str2);
}

fn push_str1(str : &mut String) {
    str.push_str("NB!");
}

fn push_str2(str : &mut str) {
    str.push_str("NB!");
}

编译出错:

error[E0599]: no method named `push_str` found for type `&mut str` in the current scope
  --> srcmain.rs:15:9
   |
15 |     str.push_str("NB!");
   |         ^^^^^^^^ method not found in `&mut str`

就是说&mut str类型没有push_str方法。

String是字符串类型,可变长度。

&str类型只是借用,就算是&mut str,也只是对一块字符串的借用。没有管理空间的权利。

fn main() {
    let mut str1 = String::from("Rust");  //String类型
    push_str1(&mut str1);
    println!("{}", str1);
    let mut str2 = "Rust";  //&str类型,因此并没有所有权
//    push_str2(&mut str2);
    println!("{}", str2);
}

fn push_str1(str : &mut String) {
    str.push_str(" NB!");
}

//fn push_str2(str : &mut str) {
//    str.push_str("NB!");
//}

还有一点,Rust的字符串并不是char数组。char是unicode编码,String是utf-8编码。

三、struct

和c++不太一样,有点像json?

1.结构体定义及初始化

struct Point {
    x: i32,
    y: i32
}

逗号隔开。

struct Point {
    x: i32,
    y: i32
}

fn main() {
    let p1 = Point{ x: 2, y: 2};
    println!("{}, {}", p1.x, p1.y);
}

运行结果:

2,2

Rust还支持以下操作:

struct Point {
    x: i32,
    y: i32
}

fn default() -> Point {
    Point { x:0, y:0 }
}

fn main() {
    let p1 = Point{ x: 2, y: 2};
    let p2 = Point{..default()};
    let p3 = Point{ x:1,..default() };
    let p4 = Point{ y:2,..default() };
    println!("p1 at: ({}, {})", p1.x, p1.y);
    println!("p2 at: ({}, {})", p2.x, p2.y);
    println!("p3 at: ({}, {})", p3.x, p3.y);
    println!("p4 at: ({}, {})", p4.x, p4.y);
}

运行结果:

p1 at: (2, 2)
p2 at: (0, 0)
p3 at: (1, 0)
p4 at: (0, 2)

非常滴方便!

结构体方法

struct Circle {
    radius : f32
}

impl Circle {
    fn get_radius(&self) -> f32 {
        self.radius
    }

    fn show() {
        println!("I am a Circle!");
    }

    fn area(&self) -> f32 {
        3.14 * self.radius * self.radius
    }
}

fn main() {
    let circle = Circle { radius : 2.0 };
    println!("the radius: {}", circle.get_radius());
    println!("the area: {}", circle.area());
    Circle::show(); //类似于静态方法吧。这里只能用类名进行调用
}

运行结果:

the radius: 2
the area: 12.56
I am a Circle!

四、enum

1.枚举的定义和使用

枚举,其中数据之间的关系是“或”的关系。

两种定义方式:

#[derive(Debug)]
enum Os_type {
    Android,
    Apple
}

struct Phone {
    Os : Os_type,
    Brand : String
}

enum Phone2 {
    Android_phone(String),
    Ios_phone(String)
}

enum Num {
    Int(u32),
    Float(f32)
}   //可以是不同的数据类型

fn main() {
    let p1 = Phone { Os : Os_type::Android, Brand : String::from("MI10") }; //类似于C语言的定义方式
    let p2 = Phone { Os : Os_type::Apple, Brand : String::from("MI10") };
    let p3 = Phone2::Android_phone(String::from("HuaWei")); //Rust推荐的定义方式
}

那么我们怎么使用enum,如何定义枚举方法呢,下面一个例子做简单说明

//枚举方法及match
impl Num {
    fn showNumber(&self) {
        match *self {
            Num::Int(val) => println!("Int: {}", val),
            Num::Float(val) => println!("Float: {}", val)
        }
    }
}

fn main() {
    let num1 = Num::Int(20);
    let num2 = Num::Float(3.14);
    num1.showNumber();
    num2.showNumber();
}

运行结果:

Int: 20
Float: 3.14

五、vector

可变长数组:

常见操作示例如下:

fn main() {
    let v1 : Vec<i32> = Vec::new();    //没有意义。
    //第一种创建方式
    let mut v1 : Vec<i32> = Vec::new();
    v1.push(1);
    v1.push(2);
    v1.push(3);
    v1.push(4);
    //利用宏vec!创建
    let mut v2 = vec!(1, 2, 3, 4);

    //数据访问
    println!("v1[2]: {}", v1[2]);
    //但是不推荐上述方式
    //推荐以下方式
    match v1.get(2) {
        Some(value) => println!("v1[2]: {}", value),
        None => println!("index error")
    }

    //不可变遍历
    for i in &v2 {
        print!("{} ", i);
    }
    println!();
    //可变遍历
    for i in &mut v2 {
        *i += 2;
        print!("{} ", i);
    }
}

运行结果:

v1[2]: 3
v1[2]: 3
1 2 3 4 
3 4 5 6

欢迎关注微信公众号:Rust编程之路

10fe366b9aeb9b2035c52d78406371c7.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
setuptools_rust 是一个 Python 扩展库,用于帮助开发者在 Python 中使用 Rust 编写的模块。Rust 是一种现代化的系统级编程语言,它的设计目标是提供安全性、并发性和性能。而 setuptools_rust 则为开发者提供了一种在 Python 中使用 Rust 编写模块的方式。 通过 setuptools_rust,开发者可以在 Python 代码中调用 Rust 提供的功能,以提高性能和效率。它提供了一种简便的方式来构建、编译和安装 Rust 模块,同时还提供了一些工具和方法来处理 Rust 和 Python 之间的交互,例如从 Rust 模块导出函数到 Python 中使用,或者从 Python 中调用 Rust 模块的功能。 setuptools_rust 的使用方式相对简单,只需在 Python 的 setup.py 配置文件中添加相应的设置,就可以使用 Rust 编写的模块。它提供了一个 rust_extensions 函数,用于指定 Rust 扩展的相关信息,如指定 Rust 源代码目录、Cargo.toml 文件等等。然后通过执行 setup 函数,即可构建和安装 Rust 模块。 使用 setuptools_rust,开发者可以充分发挥 Rust 的高性能和安全性,同时利用 Python 丰富的生态系统和易用性。这对于需要高性能计算或对安全性要求较高的项目来说尤为重要。通过使用 Rust 编写的模块,可以在 Python 中实现更快、更优雅的代码。 总结来说,setuptools_rust 提供了一种在 Python 中使用 Rust 编写的模块的方式,充分发挥了 Rust 的高性能和安全性,同时又能利用 Python 的生态系统和易用性。它简化了构建、编译和安装 Rust 模块的过程,使开发者可以更方便地在 Python 中使用 Rust 的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值