函数与方法代码实现
学习内容
- 阐述Rust语言函数与方法概念区别
- 理解实现函数与方法手段
篇目
修饰实例关键词mut
概念
关键词let
用来定义实例变量,其值是不可改变的,而在一组关键词let mut
也用来定义实例变量,但其值是可改变的。
下面具体实际代码,这样执行的话,一切正常,但是去掉注释行,就会出现编译错误。
fn main() { let instance = 1; // instance = 2; let mut instance = 1; instance = 2; }
函数与方法概念
在Rust语言里,给予了函数(function)或者更明确地说关联函数(associated function)与方法(method)两个名称不同的概念。
引用:Methods are functions attached to objects,直接翻译:方法是附加到对象的函数(行为功能),可以这么理解,方法是附属于类实例的行为功能。
而关联函数是附属于类的功能。在前面一节里,可以看到,实现类的关联函数代码方法及其调用手法。下面通过代码详细说明它们的区别。
实现方法代码
通过下面代码,实现了如下内容:
- 实现结构类型
StructType
的实例化函数new()
; - 实现结构类型
StructType
获取其属性的方法get_data()
; - 实现结构类型
StructType
变更其属性的方法set_data()
; - 实现结构类型
StructType
的属性data
是私有的; - 借助于公开性方法
get_data()
,实现结构类型的属性内容获取手法; - 借助于公开性方法
set_data()
,实现结构类型的属性内容变更手法;
在Rust语言里,ⓡ 方法的第一个参数使用其本身的引用如&self
或者&mut self
,且在调用该函数时不需要传递该参数。凡是第一个参数不是引用的就是函数。
调用函数如new()
是使用类型名称如StructType
实现的,其调用函数new()的手法是使用::
的形式,而调用函数方法如get_data()
是使用类型的实例变量如instance
实现的,其调用方法的手法是使用.
的形式。
mod trait_exerci { pub struct StructType { data: u32, } impl StructType { pub fn new(data: u32) -> StructType { StructType { data: data } } pub fn get_data(&self) -> u32 { self.data } pub fn set_data(&mut self, data: &u32) { self.data = *data; } } } // cargo run --example function_methods fn main() { let instance = trait_exerci::StructType::new(0); let data = instance.get_data(); println!("{0: <20} = {1: <20}", "instance data", data); let mut instance = trait_exerci::StructType::new(0); instance.set_data(&10); let data = instance.get_data(); println!("{0: <20} = {1: <20}", "mut instance data", data); let data = trait_exerci::StructType::new(20).get_data(); println!("{0: <20} = {1: <20}", "data", data); }
结构类型属性的私有性
结构类型StructType
的属性是私有的,所以模块之外是不可访问的,如使用语句instance.data;
是不可以的。但是使用方法get_data()
可以实现了对该属性的访问。
结构类型属性私有性的好处是隐蔽了结构类型的属性。
题外话
在终端里怎么样使用表格形式
下面打印宏println!
语句,实现了第一列和第二列占位20个字符的输出。
# #![allow(unused_variables)] #fn main() { let data = 10; println!("{0: <20} = {1: <20}", "data", data); println!("{0: <20} = {1: <20}", "data", data); println!("{0: <20} = {1: <20}", "data", data); #}