函数与方法代码实现

学习内容

  • 阐述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);
#}

参考资料