多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ### 定义 定义一个存储用户账号信息的结构体: ``` struct Rectangle { width: u32, height: u32, } ``` ### imp (`impl`是*implementation*的缩写) >一个`impl`块可以有多个函数,一个struct可以有多个`impl`块 将`area`函数移动到`impl`大括号中,并将签名中的第一个(在这里也是唯一一个)参数和函数体中其他地方的对应参数改成`self`。 ``` impl Rectangle { fn area(&self) -> u32 { self.width * self.height } } ``` ### 方法语法 使用**方法语法**(*method syntax*)在`Rectangle`实例上调用`area`方法。方法语法获取一个实例并加上一个点号,后跟方法名、圆括号以及任何参数。 ``` fn main() { let rect1 = Rectangle { width: 30, height: 50 }; println!( "The area of the rectangle is {} square pixels.", rect1.area() ); } ``` 在`area`的签名中,使用`&self`来替代`rectangle: &Rectangle`,因为该方法位于`impl Rectangle`上下文中所以 Rust 知道`self`的类型是`Rectangle`。` ` 注意仍然需要在`self`前面加上`&`,就像`&Rectangle`一样。` ` 方法可以选择获取`self`的所有权,或者像我们这里一样不可变地借用`self`,或者可变地借用`self`,就跟其他参数一样 ` ` 这里选择`&self`的理由跟在函数版本中使用`&Rectangle`是相同的:我们并不想获取所有权,只希望能够读取结构体中的数据,而不是写入。如果想要在方法中改变调用方法的实例,需要将第一个参数改为`&mut self` ***** ### Rust 有一个叫**自动引用和解引用**的特性 >在 C/C++ 语言中,有两个不同的运算符来调用方法:`.`直接在对象上调用方法,而`->`在一个对象的指针上调用方法,这时需要先解引用(dereference)指针 Rust:当使用`object.something()`调用方法时,Rust 会自动为`object`添加`&`、`&mut`或`*`以便使`object`与方法签名匹配。也就是说,这些代码是等价的: