函数与方法代码实现
学习内容
- 阐述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); #}