Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Rust - 03 - Structs and Methods

Rust - 03 - Structs and Methods

作者头像
szhshp
发布于 2023-01-05 07:57:05
发布于 2023-01-05 07:57:05
32400
代码可运行
举报
运行总次数:0
代码可运行

Rust doesn’t allow us to mark only certain fields as mutable. You can only mark whole struct as mutable or immutable.

For struct field you can use spread operator. But remember that data will be moved to new struct.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fn main() {
  // --snip--

  let user1 = User {
      email: String::from("someone@example.com"),
      username: String::from("someusername123"),
      active: true,
      sign_in_count: 1,
  };

  let user2 = User {
      email: String::from("another@example.com"),
      ..user1
  };

  print!("{}", user1.email); // Works
  print!("{}", user1.username); // Do not work, moved to user2 already
}

Tuple Structs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);

fn main() {
    let black = Color(0, 0, 0);
    let origin = Point(0, 0, 0);
}

Unit Structs

Structs with no fields

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct AlwaysEqual;

fn main() {
    let subject = AlwaysEqual;
}

Struct as Function Parameter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct Rectangle {
    width: u32,
    height: u32,
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        area(&rect1)
    );
}

fn area(rectangle: &Rectangle) -> u32 {
    rectangle.width * rectangle.height
}

Print Debug Info for Struct

prints to stdout

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Debug)]   // Required for print of struct

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!("rect1 is {:?}", rect1);
     dbg!(&rect1);
}

prints to stderr

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    let rect1 = Rectangle {
        width: dbg!(30 * scale),
        height: 50,
    };
    dbg!(&rect1);  // use ref here to prevent ownership changes

Method

  • Use impl to add method for a struct
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    // define method for Rectangle
    // the `&self` is shorthand for `self: &Self` 
    // the type Self is an alias for the type that the impl block is for.
    fn area(&self) -> u32 {  
        self.width * self.height
    }
}

fn main() {
    let rect1 = Rectangle {
        width: 30,
        height: 50,
    };

    println!(
        "The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}

Calling method with Automatic Referencing and Dereferencing

In C and C++, two different operators are used for calling methods: you use . if you’re calling a method on the object directly and -> if you’re calling the method on a pointer to the object and need to dereference the pointer first. In other words, if object is a pointer, object->something() is similar to (*object).something().

Rust automatically adds in &, &mut, or * so object matches the signature of the method. In other words, the following are the same:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p1.distance(&p2);
(&p1).distance(&p2);

Constructor in methods

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
impl Rectangle {
    fn square(size: u32) -> Self {
        Self {
            width: size,
            height: size,
        }
    }
}


Rectangle::square(3);

Multiple impl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}

impl Rectangle {
    fn can_hold(&self, other: &Rectangle) -> bool {
        self.width > other.width && self.height > other.height
    }
}


// Caution: for method without ref on self, use `Rectangle::test()` instead 
impl Rectangle {
    fn test() {
        print!("Test")
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust学习笔记(5)- 定义和实例化
结构体和tuple类似,都可以将一些相关的值组织在一起,唯一不同的是结构体里面的每一个变量需要命名,所以可读性上比tuple更好,而且也不用关心里面的值的顺序了。定义和赋值跟golang很像,直接用例子来看:
TestOps
2022/09/02
2630
Rust学习笔记之结构体
struct,或者 structure,是一个「自定义数据类型」,允许你命名和包装多个相关的值,从而形成一个有意义的组合。
前端柒八九
2023/03/23
4740
Rust学习笔记之结构体
【Rust学习】09_方法语法
在这一章,我们将一起学习下方法语法,方法类似于函数:我们使用 fn 关键字和名称声明它们,它们可以有参数和返回值,并且它们包含一些代码,当从其他地方调用方法时,这些代码会运行。与函数不同,方法是在结构体(或枚举或 trait 对象,我们将会在后续来一起学习)的上下文中定义的,它们的第一个参数始终是 self,它表示调用该方法的结构体的实例。
思索
2024/10/10
1310
【Rust学习】09_方法语法
rust 中的结构体
在许多语言中,我们都早就接触过结构体这种复合数据类型,在面向对象的语言中,类的概念与之非常类似,在 rust 语言中,结构体同样是一种实用且强大的数据类型,那么,在 rust 语言中,结构体这种数据类型要如何定义和使用呢?
用户3147702
2022/06/27
7720
【Rust学习】08_使用结构体代码示例
为了了解我们何时可能想要使用结构体,让我们编写一个计算长方形面积的程序。我们将从使用单个变量开始,然后重构程序,直到我们改用结构体。
思索
2024/09/14
1620
【Rust学习】08_使用结构体代码示例
【Rust】005-Rust 结构体
在Rust中,元组结构体是一种特殊的结构体形式,它结合了元组和结构体的特性。元组结构体类似于普通的结构体,但它没有字段名称,只有字段类型。这种结构体更像是带标签的元组,通常用于需要对某些数据进行简单封装而不需要命名每个字段的场景。
訾博ZiBo
2025/01/06
1700
Rust入坑指南:千人千构
前面我们聊过了Rust最基本的几种数据类型。不知道你还记不记得,如果不记得可以先复习一下。上一个坑挖好以后,有同学私信我说坑太深了,下来的时候差点崴了脚。我只能对他说抱歉,下次还有可能更深。不过这篇文章不会那么深了,本文我将带大家探索Structs和Enums这两个坑,没错,是双坑。是不是很惊喜?好了,言归正传。我们先来介绍Structs。
Jackeyzhe
2020/03/11
7320
rust方法和关联函数
在大多数面向对象的语言中都存在方法,方法一般和类关联在一起。在Rust中也是类似的,方法和对象总是一起出现。Rust的方法和结构体,枚举,特征一起使用。
zy010101
2023/02/27
6410
rust结构体
其中,struct是定义结构体的关键字,User是该结构体的名称,active,username,email,sign_in_count是结构体中的字段,并且给每个字段声明了类型。注意,定义结构体结束的时候没有分号。
zy010101
2023/02/10
1K0
初识Rust
虽然Rust工作上不一定用到,目前很难靠这个吃饭。但因为下面几个原因,有必要了解下Rust:
后端云
2022/11/25
5690
【Rust 基础篇】Rust 结构体详解
在Rust中,结构体(Struct)是一种自定义数据类型,它允许我们将多个相关的值组合在一起,形成一个更复杂的数据结构。结构体在Rust中被广泛应用于组织和管理数据,具有灵活性和强大的表达能力。本篇博客将详细介绍Rust中结构体的概念、定义语法、方法以及相关特性,并提供代码示例来帮助读者更好地理解结构体的使用方法。
繁依Fanyi
2023/10/12
5690
Rust方法和关联函数
1. 方法 1.1 简介 方法与函数类似:它们使用 fn 关键字和名称声明,可以拥有参数和返回值,同时包含在某处调用该方法时会执行的代码。 不过方法与函数是不同的,方法是在结构体(或者枚举、trait 对象)的上下文中被定义的。 为了使方法位于指定结构体的上下文中,需要将方法放置在该结构体的 impl 块中。 方法的第一个参数总是 self,它代表调用该方法的结构体实例。 1.2 格式 定义一个结构体的方法示例如下: struct Rectangle { width: u32, height
hotarugali
2022/03/18
5980
【Rust 基础篇】Rust数据类型详解
Rust是一种现代的、安全的系统编程语言,注重内存安全和并发性。在Rust中,数据类型是程序中最基本的构建块之一。本篇博客将详细解释Rust的各种数据类型,并提供相关代码示例。
繁依Fanyi
2023/10/12
6350
Rust中对某个结构体实现方法于rust中的关联函数
这里的impl里面就为Rectangle结构体实现了相应的面积计算方法,在调用时与其他语言相同,也是直接通过点的方式调用实例结构体上的方法。self会被推断成Rectangle类型,这与python是否类似。 注:Rust根据情况自动添加&,&mut或者*,以便object可以匹配方法的签名。 可以在impl块里定义不把self作为第一个参数的函数,叫做关联函数,类似于函数中的构造器。
gzq大数据
2021/09/22
7020
Rust语法入门
Rust 是一种系统级编程语言,它的设计目标是提供高性能、安全性和并发性。Rust 的主要优势包括:
码客说
2023/04/17
1.4K0
【Rust 基础篇】Rust 方法详解
在Rust中,方法(Methods)是与结构体、枚举和Trait相关联的函数。方法允许我们在特定类型的上下文中定义和调用函数,为数据类型提供行为和功能。方法的使用使得代码更加结构化和可读性高,同时也提高了代码的封装性和复用性。本篇博客将详细介绍Rust中方法的概念、定义语法、调用方式以及一些注意事项,并通过代码示例来帮助读者更好地理解方法的使用方法。
繁依Fanyi
2023/10/12
3390
rust语言写的贪吃蛇游戏
首先新建工程,然后用vscode打开,命令如下:cargo new snake --bin文件结构如下:图片Cargo.Toml文件内容如下:[package]name = "snake"version = "0.1.0"edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]rand = "0.4.6"pisto
福大大架构师每日一题
2022/09/27
8600
rust语言写的贪吃蛇游戏
【Rust 易学教程】第 1 天:Rust 基础,基本语法
今天,我们正式进入 Rust 基础的学习。在本文的内容中,我会为大家介绍以下内容:
前端修罗场
2023/11/12
6290
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
2170
一网打尽 Rust 语法
rust 继承、封装、多态
rust 的封装是基于结构体,而不是对象,结构体就是 rust 的对象,这个和go一样。 默认情况下,结构体只有字段。 注意,结构体自身被标记为 pub,这样其他代码就可以使用这个结构体,但是在结构体内部的字段仍然是私有的!!!! 可以通过实现结构体,来为结构体添加方法,也是和go一样的特性!!
潇洒
2023/10/23
1.7K0
相关推荐
Rust学习笔记(5)- 定义和实例化
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验