程序员之家
程序员之家

Rust 编程与项目实战-结构体

2024-11-08 16:48:46 746
在Rust中,结构体(Struct)是一种自定义数据类型,它允许我们将多个相关的值组合在一起,形成一个更复杂的数据结构。结构体在Rust中被广泛应用于组织和管理数据,具有灵活性和强大的表达能力。本节将详细介绍Rust中结构体的概念、定义语法、方法以及相关特性,并提供代码示例来帮助读者更好地理解结构体的使用方法。

在Rust中,结构体(Struct)是一种自定义数据类型,它允许我们将多个相关的值组合在一起,形成一个更复杂的数据结构。结构体在Rust中被广泛应用于组织和管理数据,具有灵活性和强大的表达能力。本节将详细介绍Rust中结构体的概念、定义语法、方法以及相关特性,并提供代码示例来帮助读者更好地理解结构体的使用方法。


结构体的定义

Rust 中的结构体与元组都可以将若干类型不一定相同的数据捆绑在一起形成整体,但结构体的每个成员和其本身都有一个名字,这样访问它的成员的时候就不用记住下标了。元组常用于非定义的多值传递,而结构体用于规范常用的数据结构。结构体的每个成员叫作“字段”。

在Rust中,我们可以使用struct关键字定义一个结构体。结构体允许我们定义多个字段(Fields),每个字段都有自己的类型和名称。通过将字段组合在一起,可以创建自己的数据类型,以便更好地表示和操作数据。以下是一个简单的结构体定义的示例:

struct Point {
    x: i32,
    y: i32,
}

在上述示例中,我们定义了一个名为Point的结构体,它具有两个字段x和y,分别是i32类型的整数。再来看一个结构体定义:

struct Site {
    domain: String,
    name: String,
    nation: String,
    found: u32
}

注意:如果你常用C/C++,请记住在Rust中struct语句仅用来定义,不能声明实例,结尾不需要“;” 符号,而且每个字段定义之后用“,”分隔。


结构体实例化

一旦定义了结构体,可以通过实例化结构体来创建具体的对象。可以通过以下两种方式实例化结构体:

1)声明式实例化

let p = Point { x: 10, y: 20 };

在上述示例中,我们使用Point结构体的定义创建了一个名为p的实例,同时指定了字段x和y 的值。

2)可变实例化

如果需要修改结构体的字段值,可以在定义结构体变量时加上mut,代码如下:

let mut p = Point { x: 10, y: 20 };
p.x = 30;
p.y = 40;

在上述示例中,我们创建了一个可变实例p,并修改了字段x和y的值。

Rust很多地方受JavaScript的影响,在实例化结构体的时候用JSON对象的key: value语法来实现,比如:

let mysite = Site {
    domain: String::from("www.qq.com"),
    name: String::from("qq"),
    nation: String::from("China"),
    found: 2024
};

如果你不了解 JSON 对象,可以不用管它,记住格式就可以了:

结构体类名 {
    字段名 : 字段值,
    ...
}

这样的好处是不仅使程序更加直观,还不需要按照定义的顺序来输入成员的值。如果正在实例化的结构体有字段名称和现存变量名称一样,可以简化书写:

let domain = String::from("www.qq.com");
let name = String::from("qq");
let runoob = Site {
    domain,  // 等同于 domain : domain,
    name,    // 等同于 name : name,
    nation: String::from("China"),
    traffic: 2024
};

有这样一种情况:想要新建一个结构体的实例,其中大部分属性需要被设置成与现存的一个结构体属性一样,仅需更改其中一两个字段的值,可以使用结构体更新语法:

let site = Site {
    domain: String::from("www.qq.com"),
    name: String::from("qq"),
  ..qq
};

注意:..qq后面不可以有逗号。这种语法不允许一成不变地复制另一个结构体实例,意思就是至少重新设定一个字段的值,才能引用其他实例的值。


结构体的方法

在Rust中,结构体可以拥有自己的方法。方法是与结构体关联的函数,可以通过结构体实例调用。以下是一个结构体方法的示例:

struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {                     //使用关键字impl来定义结构体的一个或多个方法
    fn area(&self) -> u32 {          //用关键字fn定义具体的函数
        self.width * self.height
    }
}

fn main() {
    let rect = Rectangle { width: 10, height: 20 };
    let area = rect.area();
    println!("Area: {}", area);
}

在上述示例中,我们定义一个名为Rectangle的结构体,并为其实现一个area方法,用于计算矩形的面积。在main函数中,我们创建一个Rectangle实例rect,然后通过调用area方法计算矩形的面积并打印出来。


结构体的关联函数

除实例方法外,结构体还可以定义关联函数(Associated Functions)。关联函数是直接与结构体关联的函数,不需要通过结构体实例来调用。以下是一个关联函数的示例:

struct Circle {
    radius: f64,
}

impl Circle {
    fn new(radius: f64) -> Circle {
        Circle { radius }
    }

    fn area(&self) -> f64 {
        std::f64::consts::PI * self.radius * self.radius
    }
}

fn main() {
    let circle = Circle::new(5.0);
    let area = circle.area();
    println!("Area: {}", area);
}

在上述示例中,我们定义一个名为Circle的结构体,并为其实现一个关联函数new,用于创建一个新的Circle实例。在main函数中,我们通过调用Circle::new关联函数创建一个Circle实例circle,然后通过调用area方法计算圆的面积并打印出来。


结构体的特性

Rust的结构体具有两个特性:元组结构体(Tuple Struct)和类单元结构体(Unit-Like Struct)。

元组结构体是一种特殊类型的结构体,它没有命名的字段,只有字段的类型。元组结构体使用圆括号而不是花括号来定义。比如:

struct Color(i32, i32, i32);

在上述示例中,我们定义了一个名为Color的元组结构体,它包含3个i32类型的字段。

类单元结构体是一种没有字段的结构体,类似于空元组。比如:

struct Empty;

在上述示例中,我们定义了一个名为Empty的类单元结构体。


手机扫码阅读本文


本文来自互联网,本网站转载的目的在于传递更多信息以供访问者学习参考,所属内容只代表原作者的个人观点,不代表本网站的立场和价值判断,版权归原作者所有。如有侵犯您的版权,请联系我们,我们收到后会尽快核实并第一时间改正。


手机扫码阅读本文

Rust编程与项目实战【图】
Rust编程与项目实战

本书以实战为主旨,详细介绍Rust的编程基础,并结合网络编程、图像和游戏开发、数据分析三个应用领域的实战项目,帮助读者系统掌握Rust开发技术,提高读者的实际开发水平和项目实战能力

基于Go语言的云原生【图】
基于Go语言的云原生

本书很好地将“云原生”的高级概念带到现实,并使用现代计算语言Go来实现。这两个概念的结合效果很好,带给我们许多灵感。

Go语言设计与实现(全彩印刷,图解Go底层原理,深度剖析Go源码)【图】
Go语言设计与实现(全彩印刷,图解Go底层原理,深度剖析Go源码)

近200幅精美全彩配图生动图解Go底层原理,带你轻松读懂Go源码,完成Go进阶,"面向信仰编程"博主@Draven作品

B202411081305