首页 > 编程语言 >Rust编程与项目实战-结构体

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

时间:2024-11-08 10:49:52浏览次数:4  
标签:实战 定义 示例 编程 area 实例 Rust 结构

《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)

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

8.3.1 结构体的定义

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语句仅用来定义,不能声明实例,结尾不需要“;” 符号,而且每个字段定义之后用“,”分隔。

8.3.2 结构体实例化

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

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

8.3.3 结构体的方法
在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方法计算矩形的面积并打印出来。

8.3.4 结构体的关联函数

除实例方法外,结构体还可以定义关联函数(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方法计算圆的面积并打印出来。

8.3.5 结构体的特性

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

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

struct Color(i32, i32, i32);

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

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

struct Empty;

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

 

标签:实战,定义,示例,编程,area,实例,Rust,结构
From: https://www.cnblogs.com/brucexia/p/18534643

相关文章

  • PHP与Socket编程:如何构建高效的实时通讯系统
    PHP与Socket编程:如何构建高效的实时通讯系统在现代互联网应用中,实时通讯已成为一种常见的需求,无论是在线聊天、实时通知,还是多人在线游戏,实时通讯技术都起到了至关重要的作用。PHP作为一种流行的服务器端编程语言,虽然以其简洁易用而著称,但在传统的Web应用中,它并不直接支持高效的......
  • 鸿蒙 Next 社交应用中的安全登录与密码管理实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在社交应用的......
  • 鸿蒙 Next 企业级应用安全认证体系构建实战
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。在企业级应用......
  • 移动Web前端高效开发实战:HTML 5 + CSS 3 + JavaScript + Webpack + React Native + Vu
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqsoHTML5新特性与应用:介绍HTML5的新特性,包括语义化标签、本地存储、设备兼容、连接特性等,并讲解如何在移动Web前端开发中充分利用这些特性提升用户体验。CSS3样式与动画设计:详细讲解CSS3的样式设计和动画效果,包括选择器、盒......
  • FootyForecast足球数据预测软件——XGBoost算法实战
    足球数据分析——XGBoost算法实战基于上数据分析的AI足球大模型预测平台,感兴趣的可以下载。足球预测专家推荐链接:http://lcsjfx.com/FootyForecast/DownLoad随着足球数据的日益丰富,数据分析在足球领域的应用也越来越广泛。其中,XGBoost算法作为一种高效、强大的机器......
  • TensorFlow+Keras自然语言处理实战 (王晓华)
    书:pan.baidu.com/s/1tIHXj9HmIYojAHqje09DTA?pwd=jqsoTensorFlow与Keras框架概述:介绍TensorFlow和Keras的发展历程、基本特性和在自然语言处理中的应用优势。环境搭建与基础配置:详细指导读者如何从零开始搭建TensorFlow和Keras所需的运行环境,包括Python、Anaconda、PyCharm等......
  • 并发编程(6)——future、promise、async,线程池
    六、day6今天学习如何使用std::future、std::async、std::promise。主要内容包括:参考:https://llfc.club/category?catid=225RaiVNI8pFDD5L4m807g7ZwmF#!aid/2Agk6II6SsiG8DwPawfXHsP4bUThttps://github.com/Mq-b/ModernCpp-ConcurrentProgramming-Tutorial/blob/main/md......
  • 并发编程(8)—— std::async、std::future 源码解析
    文章目录八、day81.std::async2.std::future2.1wait()2.2get()八、day8之前说过,std::async内部的处理逻辑和std::thread相似,而且std::async和std::future有密不可分的联系。今天,通过对std::async和std::future源码进行解析,了解二者的处理逻辑和关系。源码均基......
  • Windows下Cassandra数据库安装及编程访问
    前提紧要:由于我的Java版本是Java8所以为了兼容,我选择了apache-cassandra-3.11.11官网下载链接:https://www.apache.org/dyn/closer.lua/cassandra/3.11.11/apache-cassandra-3.11.11-bin.tar.gz通常推荐使用Java8来运行Cassandra3.x版本,因为它的性能和稳定性在这一组合下得......
  • Next.js 实战开发入门教程敏捷开发框架
    在上一篇文章中,我们已经成功实现了网站的导航栏。接下来,我们将继续开发网页的主体部分,用于展示我们的网站业务情况。主页内容展示首先,我们需要创建一个名为 /app/components/Main.tsx 的文件,作为主页内容的入口。然后在根目录的 /app/page.tsx 中引入这个组件,这样在访问主页......