Rust中函数和作用域

起因

在前面 Rust类型学习 和 Rust控制语句 分别对Rust中的类型和控制语句进行了学习,今天来学习函数的使用,及其变量的作用域。

看图了解本文的内容

Rust中的函数 方法 作用域

函数

函数定义
///# 函数的使用
/// 1. fn 后跟函数名+小括号  ->()相当于其他语言中void表示无返回值,可以简化不写
/// 2. { //函数主体内容 }
/// 简写方式 fn func_test() { println!("denfine function!"); }
fn func_test() -> () {
    println!("denfine function!");
}

带返回值的函数

///# 带返回值的函数
///1. 在函数名后括号中 先写参数名 后跟参数类型. 这和c/c++/c#/java语言不同, 和go语言一样
///2. 和其他语言(c/c++/c#/go/java)不一样, 返回值前不用加return,这点有点怪异,在业务逻辑复杂的情况,看代码不是很好
fn add(x: i32, y: i32) -> i32 {
    x + y
}

///# 调用带返回值的add函数
fn func_call() {
    let x = 100;
    let y = 200;
    let result = add(x, y);
    println!("x+y={}", result);
}

回调函数的使用

///# hi函数作为参数调用
fn hi(name: &str) {
    println!("call {} () function.", name);
}

///# hello函数最为参数调用
fn hello(name: &str) {
    println!("call {} () function.", name);
}

///# 参数为函数指针
///可以这样理解func:fn(&str)  => fn func(&str) &str为字符串
fn callback_(name:&str,func:fn(&str)){
    func(name);
}

///# 回调函数使用
fn callback_call(){
    let str1 ="hi";
    let str2="hello";
    //第二个参数传入hi函数
    callback_(str1,hi);
    //第二个参数传入hello函数
    callback_(str2,hello);
}


方法

在常用c/c++/c#/java语言中,函数和方法等同,在Rust语言中,方法和函数是有区别的.
主要区别在方法是实例对象中.
///# 结构体
///# 定义结构体,通过#[derive(Debug)]注解,才能让println!打印结构体内容
#[derive(Debug)]
struct People {
    id: u32,
    //id
    name: &'static str,
    //姓名 字符串
    sex: &'static str, //性别
}

///# 使用impl对对象People增加行为(定义方法)
impl People {
    //self 表示自身(这里为People)
    fn show(&self) {
        println!("id={} name={}", self.id, self.name);
    }
}


fn method_call() {
    let p = People {
        id: 1,
        name: "tom",
        sex: "man",
    };
    p.show();  //调用p中show方法
}

作用域

变量和实例作用域这个概念,在常见的编程语言都存在的,这个不是新的东西。
///# 作用域
///在Rust语言中,在同一个作用域中声明多个同名的变量是允许的,但还是尽量不要在同一个作用域内声明多个同名的变量
fn scope_test() {
    //x的作用域是在函数内
    let x = 10;
    println!("x={}", x);
    {
        //y的作用域在 所在的大括号内,在大括号之外是无法访问变量y的
        let y = 20;
        println!("y={}", y);
    }
    //在Rust中同一个作用域内,可以声明多个同名的变量,这点和主流编程语言不一样
    let x = 20;
    println!("x={}", x);
}


秋风 2019-10-14