Rust Struct结构体详解

Rust Struct结构体详解

结构体是Rust语言中非常重要和常用的数据类型,用来表示一组相关数据的集合。结构体可以包含不同类型的数据,比如整形、浮点数、字符串等等,也可以包含其他结构体。在该攻略中,我们将详细讲解Rust结构体的用法和注意事项。

定义结构体

结构体可以通过struct关键字定义,在结构体定义中需要指定结构体的字段及其类型。结构体中的字段可以被访问和修改。

示例代码:

struct Person {
    name: String,
    age: u32,
    address: String,
}

上面的代码中定义了一个Person结构体,包含name、age和address三个字段。其中name和address是String类型的变量,age是一个无符号整数。

初始化结构体

在Rust中,可以用大括号初始化结构体。大括号中的字段名必须与结构体定义中的字段名对应。可以通过name: value的形式初始化结构体中的每个字段。

示例代码:

let person = Person {
    name: String::from("Alice"),
    age: 20,
    address: String::from("China"),
};

上面的代码中,初始化了一个Person结构体,对于name和address字段使用了String::from()方法,实现了动态分配内存。

访问结构体的字段

访问结构体的字段非常简单。可以使用.号后跟字段名来访问。

示例代码:

let person = Person {
    name: String::from("Alice"),
    age: 20,
    address: String::from("China"),
};
println!("name is {}", person.name);

上面的代码中,通过.号来访问Person结构体中的name字段,并将其打印出来。

修改结构体的字段

结构体中的字段默认情况下是不可变的,无法修改。必须使用mut关键字将其标记为可变的才能修改结构体中的字段。

示例代码:

let mut person = Person {
    name: String::from("Alice"),
    age: 20,
    address: String::from("China"),
};
person.address = String::from("Japan");

上面的代码中,定义了一个可变的Person结构体,并使用.号来访问和修改了它的address字段。

实现结构体中的方法

Rust允许在结构体中定义方法。方法可以被结构体的实例调用。方法是结构体中的关联函数,它们使用impl关键字实现。

示例代码:

struct Person {
    name: String,
    age: u32,
    address: String,
}

impl Person {
    fn new(name: String, age: u32, address: String) -> Self {
        Self {
            name,
            age,
            address,
        }
    }

    fn say_hello(&self) {
        println!("Hello, my name is {}", self.name);
    }
}

上面的代码中,定义了一个Person结构体和两个方法。new方法用于初始化Person实例,say_hello方法输出一段问候语。注意,方法第一个参数必须是self或其引用,表示将要调用方法的结构体实例。

结构体之间的嵌套

在结构体内部,可以嵌套其他结构体。这是非常常见和有用的数据结构模型。

示例代码:

struct Address {
    country: String,
    city: String,
}

struct Person {
    name: String,
    age: u32,
    address: Address,
}

let person = Person {
    name: String::from("Alice"),
    age: 20,
    address: Address {
        country: String::from("China"),
        city: String::from("Beijing"),
    },
};

上面的代码中,定义了两个结构体,一个是Address,一个是Person。并在Person结构体中包含了一个Address结构体。

示例一

struct Triangle {
    a: f64,
    b: f64,
    c: f64,
}

impl Triangle {
    fn new(a: f64, b: f64, c: f64) -> Option<Self> {
        if a + b > c && a + c > b && b + c > a {
            Some(Triangle { a, b, c })
        } else {
            None
        }
    }

    fn perimeter(&self) -> f64 {
        self.a + self.b + self.c
    }

    fn area(&self) -> f64 {
        let p = self.perimeter() / 2.0;
        (p * (p - self.a) * (p - self.b) * (p - self.c)).sqrt()
    }
}

fn main() {
    let t = Triangle::new(3.0, 4.0, 5.0).unwrap();
    println!("Perimeter = {}", t.perimeter());
    println!("Area = {}", t.area());
}

上述代码实现了一个Triangle结构体,它有三个字段abc表示三角形的三个边长。通过impl关键字实现了new方法,用于创建一个合法的三角形。如果给定的边长无法构成三角形,则返回None。通过perimeter方法计算三角形的周长,通过area方法计算三角形的面积。

示例二

struct Circle {
    radius: f64,
}

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

    fn diameter(&self) -> f64 {
        self.radius * 2.0
    }

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

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

fn main() {
    let c = Circle::new(10.0);
    println!("Diameter = {}", c.diameter());
    println!("Circumference = {}", c.circumference());
    println!("Area = {}", c.area());
}

上述代码实现了一个Circle结构体,它有一个字段radius表示圆的半径。通过impl关键字实现了new方法,用于创建一个合法的圆。通过diameter方法计算圆的直径,通过circumference方法计算圆的周长,通过area方法计算圆的面积。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Rust Struct结构体详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • java通过客户端访问服务器webservice的方法

    客户端通过wsimport工具生成webservice客户端代码 首先,我们需要使用wsimport工具生成webservice客户端代码。wsimport工具是JDK自带的一个工具,可以根据WSDL(WebService Description Language,WebService描述语言)文件生成客户端代码。 步骤如下: 使用浏览器访问webservi…

    other 2023年6月27日
    00
  • 给力Windows XP如何添加“管理员取得所有权”右键菜单

    这里是添加“管理员取得所有权”右键菜单的完整攻略: 1. 打开注册表编辑器 在 Windows XP 中,打开注册表编辑器的方法为:点击”开始”,选择”运行”,输入”regedit”并回车。这将打开注册表编辑器界面。 2. 定位注册表项 在注册表编辑器打开后,依次展开以下目录: HKEY_CLASSES_ROOT\*\shell 在 shell 目录下新建一…

    other 2023年6月27日
    00
  • tar 解压某个指定的文件或者文件夹

    Tar 解压某个指定的文件或者文件夹的完整攻略 Tar是一种常见的文件压缩和归档工具,可以将多个文件或文件夹打包成一个文件,并进行压缩。本攻略将介绍如何使用Tar解压某个指定的文件或文件夹,并提供两个示例说明。 解压某个指定的文件或文件夹 以下是使用Tar解压某个指定的文件或文件夹的步骤: 打开终端或命令行界面。 使用tar命令解压指定的文件或文件夹。 示例…

    other 2023年5月7日
    00
  • PostgreSQL教程(一):数据表详解

    以下是《PostgreSQL教程(一):数据表详解》的完整攻略: 概述 本文将介绍 PostgreSQL 中数据表的相关知识,包括如何创建和删除数据表,以及数据表中的各种数据类型和约束等。 创建数据表 创建数据表需要使用 SQL 中的 CREATE TABLE 语句,该语句的基本语法如下: CREATE TABLE table_name ( column1 …

    other 2023年6月25日
    00
  • unity使用rider作为ide的体验

    Unity使用Rider作为IDE的体验 前言 Unity作为目前最流行的游戏引擎之一,它的易用性与灵活性都得到了众多开发者的青睐。而对于游戏开发者来说,选择好一款IDE是非常重要的。在本文中,我们将会讨论Unity与 JetBrains 均鼎力推荐的 IDE——Rider。 Rider是什么 Rider是一款由JetBrains开发的跨平台的C# IDE,…

    其他 2023年3月29日
    00
  • MySql如何去除字符串前缀,两边,后缀

    MySql如何去除字符串前缀、两边和后缀 在MySQL中,可以使用内置的字符串函数来去除字符串的前缀、两边和后缀。下面是详细的攻略: 去除字符串前缀 要去除字符串的前缀,可以使用SUBSTRING()函数结合LENGTH()函数来实现。具体步骤如下: 使用SUBSTRING()函数截取字符串,指定起始位置为前缀的长度加1。 使用LENGTH()函数获取字符串…

    other 2023年8月6日
    00
  • 将数据导入hive,将数据从hive导出

    将数据导入Hive,将数据从Hive导出的完整攻略 Hive是一个基于Hadoop的数据仓库工具,它可以将结构化数据映射到Hadoop的分布式文件系统上,并提供类SQL查询功能。本文将为您提供一份详细的将数据导入Hive,将数据从Hive导出的完整攻略,包括数据导入和导出的基本概念、使用方法和两个示例说明。 数据导入的基本概念 在Hive中,数据导入是指将数…

    other 2023年5月5日
    00
  • Python数据结构之图的存储结构详解

    Python数据结构之图的存储结构详解 什么是图 图是一种数据结构,用于表示不同对象之间的关系。在图中,对象通常表示为称为顶点的节点,而它们之间的关系称为边。边可以是无向的(没有方向)或有向的(有方向)。图分为有向图和无向图两种类型,根据边是否有方向来区别。 无向图 在无向图中,边没有方向,例如下图: A — B | | C — D 上面的图表示四个顶点…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部