藏宝游

 找回密码
 立即注册
查看: 122|回复: 1

[其它] Rust 函数详解

[复制链接]
  • TA的每日心情
    无聊
    2024-3-8 09:16
  • 签到天数: 445 天

    [LV.9]登峰造极

    灌水成绩
    22
    521
    5451
    主题
    帖子
    积分

    等级头衔

    ID : 4

    版主

    积分成就 威望 : 15
    贡献 : 15
    杰币 : 4854
    在线时间 : 101 小时
    注册时间 : 2022-1-8
    最后登录 : 2024-3-8

    荣誉勋章
    发表于 2024-3-10 13:39:05 | 显示全部楼层 |阅读模式
    目录

      函数参数函数返回值高阶函数
        函数指针类型函数作为参数函数作为返回值
      相关资料

    Rust 支持多种编程范式,但更偏向于函数式,函数在 Rust 中是“一等公民”,函数可以作为数据在程序中进行传递。跟 C、C++ 一样, Rust 也有一个唯一的程序入口 main 函数。
    示例:程序入口 main 函数
    1. fn main() {    println!("Hello, world!");}
    复制代码
    Rust 使用 fn 关键字来声明和定义函数,使用 snake case 风格来命名函数,即所有的字母小写并使用下划线分隔单词。函数可以有参数,并且每个函数都有返回值。

    函数参数

    参数的声明方式:参数名 + 冒号 + 参数类型
    示例
    1. // 定义一个无参函数fn function() {    println!("A function with no parameters.");}// 定义一个有参函数fn hello(name: &str) {  println!("Hello, {}.", name);}
    复制代码
    函数返回值

    在 Rust 中所有函数都有返回值,main 函数也不例外,main 函数的返回值是 ()(一个空的元组)。在 Rust 中,当一个函数返回 () 时,可以省略返回值类型的声明。main 函数的完整形式如下:
    1.   fn main() -> () {    //statements  }
    复制代码
    () 通常被称为 unit 或者 unit type,它其实类似于 C/C++、Java、C#中的 void 类型。
    若函数有其他类型返回值,则需使用 -> 显式标明返回值类型。像 C/C++ 或 Java 等语言在函数中需要用 return 语句返回一个值,Rust 与它们不一样,Rust 默认将函数中最后一个表达式的结果作为返回值。
    示例:定义一个有返回值的函数
    1. fn main() {    let x = plus_one(5);    println!("The value of x is: {}", x);}fn plus_one(x: i32) -> i32 {    x + 1}
    复制代码
    Rust 也有 return 关键字,不过一般用于提前返回。
    示例:在函数中使用 return
    1. fn main() {  let a = [1,3,2,5,9,8];  println!("There is 7 in the array: {}", find(7, &a));  println!("There is 8 in the array: {}", find(8, &a));}fn find(n: i32, a: &[i32]) -> bool {  for i in a {    if *i == n {      return true;    }  }  false // 这里也可以改为 `return false;`,但这就不是 Rust 的编程风格了}
    复制代码
    在 Rust 中还有一种“没有返回值”的函数,称之为发散函数(diverging function)。其实,它根本就不返回,它使用感叹号 ! 作为返回类型。
    示例
    1. fn main() {  println!("hello");  diverging();  println!("world");}fn diverging() -> ! {  panic!("This function will never return");}
    复制代码
    发散函数一般都以 panic! 宏调用或其他调用其他发散函数结束,所以,调用发散函数会导致当前线程崩溃。

    高阶函数

    高阶函数与普通函数的不同在于,它可以使用一个或多个函数作为参数,可以将函数作为返回值。既然函数可以作为参数和返回值,那么函数也应该有一种相对应的数据类型,那就是:函数指针类型。

    函数指针类型

    函数指针类型使用 fn 关键字定义,在编译时该类型指向一个已知函数参数和返回值类型,但函数体未知的函数。
    示例
    1. // 函数定义fn inc(n: i32) -> i32 {    n + 1}// 使用 `type` 给函数指针类型起一个别名type IncType = fn(i32) -> i32;fn main() {    // 使用函数指针类型 `fn(i32) -> i32`    let func: fn(i32) -> i32 = inc;    println!("3 + 1 = {}", func(3));    // 使用函数指针类型的别名 `IncType`    let func: IncType = inc;    println!("4 + 1 = {}", func(4));}
    复制代码
    函数作为参数

    函数作为参数,其声明与普通参数一样。
    示例:高阶函数
    1. fn main() {  println!("3 + 1 = {}", process(3, inc));  println!("3 - 1 = {}", process(3, dec));}fn inc(n: i32) -> i32 {  n + 1}fn dec(n: i32) -> i32 {  n - 1}// process 是一个高阶函数,它有两个参数,一个类型为 `i32`,另一个类型为 `fn(i32)->i32`fn process(n: i32, func: fn(i32) -> i32) -> i32 {  func(n)}
    复制代码
    函数作为返回值

    函数作为返回值,其声明与普通函数的返回值类型声明一样。
    示例
    1. fn main() {    let a = [1,2,3,4,5,6,7];    let mut b = Vec::::new();    for i in &a {        b.push(get_func(*i)(*i));    }    println!("{:?}", b); } // 若传入的参数为偶数,返回 `inc`,否则返回 `dec` fn get_func(n: i32) -> fn(i32) -> i32 {    fn inc(n: i32) -> i32 {        n + 1    }    fn dec(n: i32) -> i32 {        n - 1    }    if n % 2 == 0 {        inc    } else {        dec    }}
    复制代码
    相关资料

    Rust Programming Language
    The Rust Reference
    Rust By Example
    RustPrimer
    到此这篇关于Rust 函数的文章就介绍到这了,更多相关Rust 函数内容请搜索咔叽论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持咔叽论坛!

    原文地址:https://www.jb51.net/article/228907.htm
  • TA的每日心情
    开心
    半小时前
  • 签到天数: 63 天

    [LV.6]自成一派

    灌水成绩
    0
    208
    1235
    主题
    帖子
    积分

    等级头衔

    ID : 2028

    金牌会员

    积分成就 威望 : 33
    贡献 : 0
    杰币 : 1027
    在线时间 : 25 小时
    注册时间 : 2024-2-29
    最后登录 : 2024-5-17

    荣誉勋章
    发表于 2024-4-12 12:00:54 | 显示全部楼层
    膜拜神贴,后面的请保持队形~最爱藏宝游cbvy
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|RSS|藏宝游 ( 豫ICP备2021017492号 )|网站地图

    GMT+8, 2024-5-17 10:21 , Processed in 0.031462 second(s), 10 queries , Redis On.

    Powered by Discuz! X3.4

    本站不储存任何资源,所有资源均来自用户分享的网盘链接。
    本站为非盈利性站点,不会收取任何费用,所有内容不作为商业行为。

    快速回复 返回顶部 返回列表