Rust Struct结构体详解

yizhihongxing

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日

相关文章

  • 【图文】迅雷会员钻石子账号怎么设置?

    【图文】迅雷会员钻石子账号怎么设置? 什么是迅雷会员钻石子账号? 迅雷会员钻石子账号是指开通迅雷会员之后,可以给家人或朋友赠予开通会员的子账号。子账号可以独立开通和管理会员,享受会员权益,但子账号的开通费用由主账号支付。 如何设置迅雷会员钻石子账号? 步骤如下: 登录迅雷会员账号,进入“个人中心”页面。 点击左侧菜单栏中的“子账号管理”。 点击“创建子账号”…

    other 2023年6月27日
    00
  • C#中对象状态模式教程示例

    C#中对象状态模式教程示例 状态模式是一种行为设计模式,用于根据对象的内部状态改变其行为。在C#中,可以使用对象状态模式来实现这种行为变化。以下是关于C#中对象状态模式的详细攻略。 步骤1:定义状态接口和具体状态类 首先,需要定义一个状态接口(IState),并在该接口中声明对象的行为方法。然后,创建具体的状态类,实现状态接口,并根据不同的状态实现相应的行为…

    other 2023年10月15日
    00
  • C语言深入分析整形数据存储

    C语言深入分析整型数据存储 1. 整型数据存储方式 在C语言中,整形数据可以使用不同的存储方式:有符号数表示正数和负数,无符号数只表示非负数。从存储方式上来讲,整型数据的存储可以分为大端和小端两种方式。 1.1 有符号数的存储 有符号数使用补码表示。最高位表示符号位,0表示正数,1表示负数,剩下的位表示数值。以8位为例,有符号数-1的补码为11111111。…

    other 2023年6月27日
    00
  • C++类成员函数中的名字查找问题

    当涉及到C++类成员函数中的名字查找问题时,以下是一个完整的攻略,其中包含两个示例说明。 名字查找规则 在C++中,类成员函数的名字查找遵循以下规则: 首先,在类内部查找函数名。 如果在类内部找不到函数名,则在类的基类中查找。 如果在基类中找不到函数名,则在全局作用域中查找。 示例1:类成员函数名字查找 #include <iostream> c…

    other 2023年8月10日
    00
  • windows11怎么设置默认应用程序?win11更改默认应用程序方法

    以下是针对“Windows 11怎么设置默认应用程序?Win11更改默认应用程序方法”的完整攻略: 1. 打开设置菜单 首先,我们需要打开系统设置菜单,以找到默认应用程序设置选项。有两种方式可以打开设置菜单: 1.1. 点击”开始”菜单 点击左下角的“开始”图标,然后点击“设置”(齿轮形图标)来打开设置菜单。 1.2. 使用快捷键 按下”Win + i”组合…

    other 2023年6月25日
    00
  • Lua中的全局变量、非全局变量总结

    Lua 中的变量分为全局变量和局部变量两种,全局变量可以在脚本的任何位置进行访问,而局部变量只在定义它的函数或语句块中可见。本文将对 Lua 中的全局变量和非全局变量进行总结,探讨它们的使用方法和注意事项。 Lua 中的全局变量 在 Lua 中,全局变量可以通过直接赋值的方式进行创建和修改。如果变量未赋值,则默认为 nil。在访问一个未定义的全局变量时,Lu…

    other 2023年6月27日
    00
  • 【unity基础知识之三】unityassets目录下的特殊文件夹名称

    【Unity基础知识之三】UnityAssets目录下的特殊文件夹名称 在Unity中,Assets目录是存放所有游戏资源的地方。在Assets目录下,还有一些特殊的文件夹,它们拥有专属的名称和用途。本文将会介绍这些特殊文件夹的名称和作用。 1. Assets/Editor 此文件夹用于存放编辑器脚本。在此文件夹中的脚本不会被打包到最终应用程序中,而且只能在…

    其他 2023年3月29日
    00
  • 探讨:如何在ScrollView中嵌套ListView

    探讨: 如何在ScrollView中嵌套ListView 在Android开发中,有时候我们需要在一个滚动视图中嵌套另一个可滚动的列表视图。然而,直接将ListView放在ScrollView中是行不通的,因为它们都会尝试处理滚动事件,导致冲突。在本攻略中,我们将探讨如何解决这个问题,并提供两个示例说明。 方法一:使用RecyclerView替代ListVi…

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