龙空技术网

如何在 Rust 结构体中使用方法?

geek流川风 58

前言:

此时姐妹们对“结构体的使用方法有哪些”大概比较关注,大家都需要学习一些“结构体的使用方法有哪些”的相关内容。那么小编同时在网络上搜集了一些关于“结构体的使用方法有哪些””的相关文章,希望兄弟们能喜欢,姐妹们快快来学习一下吧!

如果使用结构体表示矩形,并计算它的面积,可能会这么写:

如果新增圆形,为了计算圆形面积,函数名可能会写成 circle_area()。随着形状的增加,计算面积的函数名也在不断增加,这不够优雅。

此时,我们可以通过方法来优雅的解决这个问题。

一、定义方法

方法(methods)和函数(functions)很像,都使用 fn 关键字定义,都有自己的名字,都可以有输入参数和返回值。但和普通函数不同,方法需要在结构体(或者枚举、特征对象)上下文中定义,并且它们的第一个参数永远是 self,代表调用方法的当前实例。

方法参数 &selfself: &Self 的简写形式。Self 是一种类型别名,表示当前上下文的类型。使用 &self 表示当前方法使用了不可变引用,不会转移所有权,也不会修改原始值。如果方法需要修改原始值,需要使用可变引用 &mut self

结构体的方法可以和字段同名。Rust 编译器通过尾部是否带圆括号,判断它是字段还是方法。比如 rect1.width 是字段,rect1.width() 是方法。

二、多参数方法

如果要给方法传递参数,把它放在 &self 之后即可。

三、关联函数

关联函数(associated functions)指的是在 impl 块中定义的函数,因为它们和 impl 后的类型相关联。如果关联函数的第一个参数不是 self,那么它就不是方法,因为它不依附于任何实例。之前见过的 String::from() 就是这样一种关联函数。

按照惯例,通常使用 new() 函数当作构造函数(constructor)。但是,new 本身并没有什么特权,甚至不是关键字,它只是个芸芸众生的普通函数名。除了它,你可以选用任意函数名。

在 Rust 中,关联函数、构造函数和方法的三者关系如下所示:

举个例子,在矩形结构体中,定义 square 关联函数,可以创建一个正方形。调用关联函数时,需要使用结构体名和 :: 符号。

四、多个 impl 块

impl 块的数量可以有多个,上不封顶。把一个 impl 块拆成多个,语法上没有任何问题。

五、输出结构体信息

如果你尝试在 println! 宏中直接输出结构体信息,会发现并不如意。

根据报错原因,我们看到,结构体需要实现 std::fmt::Display 特征,才能在 println! 宏中实现自定义打印。

实现 Display 特征比较麻烦,因为会涉及一些目前尚未接触的概念。一个更简单的方法是继承 Debug 特征。操作方法是在结构体上方增加 #[derive(Debug)] 确定继承关系,然后在 println! 宏中使用 {:?} 占位符打印输出。

参考资料An Example Program Using Structs, Method Syntax,

标签: #结构体的使用方法有哪些