首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rust函数需要return关键字。为什么?

Rust函数需要return关键字是因为Rust采用了一种不同于其他编程语言的控制流设计,即“表达式式控制流”(expression-based control flow)。在大部分编程语言中,函数的返回值是通过return语句显式地指定的,而Rust则通过函数体中的最后一个表达式来隐式地返回函数的结果。

这种设计有以下几个优势和特点:

  1. 简洁性:省略了显式的return语句,减少了代码量,使代码更加简洁和易读。
  2. 避免错误:由于Rust是静态类型语言,函数的返回类型在函数签名中进行了明确的声明。通过在函数体的最后一个表达式中定义返回值,Rust可以确保函数的返回类型与函数签名中声明的类型一致,从而避免了因为忘记return语句或者返回类型不匹配而引发的错误。
  3. 代码块作用域:Rust中的代码块(Block)可以作为表达式使用,并且可以根据需要返回一个值。这样,通过代码块内最后一个表达式的返回值,可以实现更灵活的控制流,例如在循环中使用break语句提前结束循环并返回结果。

总结起来,Rust函数需要return关键字的主要原因是为了简化代码、提高代码可读性,同时通过静态类型检查和控制流的灵活性来避免潜在的错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【JavaScript】函数 ⑤ ( return 关键字终止函数 | return 关键字返回一个值 | return 关键字返回多个值 - 返回数组对象 )

一、JavaScript 函数返回值 1、return 关键字终止函数 return 关键字 除了 返回 函数返回值 功能之外 , 还具有 终止 函数执行 的作用 , return 关键字后面的语句...// 定义函数 function add(num1, num2) { console.log("return 关键字前面的语句");... 执行结果 : 2、return 关键字返回一个值 在函数中 , return 关键字 只能 返回一个 返回值 ; 如果 使用 return 关键字 返回...如果需要返回多个值 , 可以 使用 return 关键字 返回一个数组 ; JavaScript 中的数组 相当于 Java 中的 ArrayList , 可以动态改变元素个数 ; 代码示例 : 在下面的代码中..., add 函数返回一个数组 [num1, num2, num1 + num2] , 此时数组对象被当做一个返回值对待 , 因此 可以使用 return 关键字返回 ; <!

16810
  • Rust问答】关于函数不写return时候返回值的疑惑

    unit (),而if里面的0却是integer,所以报错了 我知道下面2种做法可以编译通过: 把1放进else里面 在0前面显式的加上return 现在问题来了: 这个编译不通过的函数,我标注了返回类型为...i32,而且函数体内怎么看返回的也不是()啊,为什么编译器会认为返回的是()类型呢?...--- javasaint 2019-12-18 17:57 我来分析一下,rust初学者,可能术语用得不太恰当,但差不多应该是这个意思 fn r(n: i32) -> i32 { if n > 0 {...0 } 1 } rust编译器认为函数体是由一个语句和表达式组成的 if n > 0 { 0 } 和 1 因为没有else,所以它不认为if 代码块是表达式的一部份 所以做为函数返回值的是 1 这个表达式...第一个语句中的代码块的最后一行是表达式,但其它本身又不是条件赋值语句,所以编译器认为代码块应该返回的是(),也就是unit类型 c5soft 2019-12-18 21:26 if 作为rust的表达式

    2.7K20

    【JavaScript】函数 ④ ( 函数返回值 | 函数返回值语法 return 关键字 | 函数默认返回值 undefined )

    " 返回值 " 会被返回给调用者 ; 如果 函数 中没有明确 使用 return 关键字 返回 " 返回值 " , 那么函数会默认返回undefined 值 ; 2、函数返回值语法 在 JavaScript...中 , 函数 返回值是 通过 return 语句实现 , 在函数体 中 使用 return 语句 指定函数返回的值 , 使用 return 语句后 会立即终止函数的执行 , return 返回值 语法如下...: function functionName(parameters) { // 函数return expression; // 返回值 } 在 JavaScript 中的返回值类型..., 不需要函数 声明中注明 返回值类型 ; 3、函数默认返回值 在下面的代码中 , 定义了 add 函数 , 并且该函数没有 显示使用 return 关键字 返回返回值 ; 此时 执行 add 函数...> 执行结果 : 打印出来的 函数返回值 是 undefined 未定义值 ; 4、函数默认返回值 在下面的代码中 , add 函数 中 使用 return 关键字 返回返回值

    24910

    python为什么需要函数、类这些概念

    今天,我们就来探讨一下,为什么需要定义类。 它到底解决了什么问题,与函数有什么不一样。 ---- 函数就是编写行动计划 我们用一个文件数据拆分小需求作为例子。...因为,它需要上一个函数"配合",返回去掉的数据。 于是,第二个函数要修改它的返回值才能满足: 重点: 这种使用函数,面向流程的组织方式就有这种缺点。...在执行流程开始之前,定义一个空字典 每执行一个小函数,必须传入这个字典 小函数需要返回结果数据,有需要保留数据,就直接写入到这个字典中 此时,每个小函数的第一个参数都是字典: 现在函数之间数据的依赖关系...函数中设定参数,用于保存过程中需要的数据 当然,这种方式有一些缺点,比如执行的时候无法得到智能提示,因为现在函数需要从字典中取出。...这种方式可以让你理解带数据状态的执行流程: 每次要执行,都需要调用函数 new 。这个函数做了什么?

    67241

    为什么需要一个激励函数

    各位小伙伴们大家好,好久不见,今天让我们来一起聊一聊现代神经网络中必不可少的一个组成部分激励函数以及我们在机器学习中为什么少不了激励函数. 那首先第一个问题,什么是激励函数呢?...女生也不可能是无穷漂亮的吧,(对于我们男生来说,这个问题有时间我们好好的讨论下) 那这个时候,我们其实就可以讨论如何在神经网络中描述线性和非线性任务了,在这个时候,其实我们可以把整个神经网络写成一个式子Y=Wx W是我们需要的参数...是我们预测得到的结果.用这个式子,我们就可以很好地来去描述刚才我们提出的那个线性问题,因为W提出来的是一个固定的数,但是这样似乎并不能符合我们想让这个直线扭动起来成为非线性方程的一个结果,这个时候,就需要我们这个文章的主人公激励函数了...,这个时候激励函数就拔刀相助,出来说,让我来掰弯他吧(y=AF(Wx)),这里的AF就是所说的激励函数.激励函数这时候掏出了自己的掰弯利器,用力套在了原函数上,这样原函数就被掰弯了....那么这个时候你就会想问,在很多的例子中,我们使用的最多的激励函数是那些?最好用的激励函数是那些?

    94670

    为什么我们的神经网络需要激活函数

    如果你正在读这篇文章,那么很可能你已经知道什么是神经网络,什么是激活函数,但是,一些关于机器学习的入门课程并不能很清楚地说明,为什么我们需要这些激活函数。我们需要它们吗?...对于隐藏层,您可以自由选择需要多少节点,并且可以使用多个隐藏层。...然后我们需要一个输出神经元它将之前的两个神经元作为输入,这样它就能正确地进行分类。 对于最后一个做正确分类的神经元,它需要n1和n2隐藏神经元的输出是线性可分的,如果我们把它们画在一个二维平面上。...我们需要更多的东西。我们需要将每个神经元计算出的加权和传递给一个非线性函数,然后将这个函数的输出看作那个神经元的输出。这些函数称为激活函数,它们在允许神经网络学习数据中的复杂模式时非常重要。...[1] 已经证明,具有2层(输入层除外)和非线性激活函数的神经网络,只要在这些层中有足够多的神经元,就可以近似任何函数。那么,如果只有两层就够了,为什么人们现在还在使用更深层次的网络呢?

    57120

    汇编程序调用c函数为什么需要设置栈?

    因此,在函数调用之前,应该将这些寄存器等现场暂时保存(入栈push),等调用函数执行完毕后出栈(pop)再恢复现场。这样CPU就可以正确的继续执行了。...传递参数 C语言函数调用时,会传给被调用函数一些参数,对于这些C语言级别参数,被编译器翻译成汇编语言时,要找个地方存放下来,并且让被调用函数能访问,否则没法传递。找个地方存放下来分2种情况。...clock_init前用到的寄存器r0,没有冲突,故此处不用push保存,有个寄存器要注意,r14,即lr,前面调用clock_init时,用的bl指令,所以会自动把跳转时的pc值赋值给lr,所以也不需要...这样便实现了函数的正确返回,即返回到了函数调用时下一个指令的位置。...,CopyCode2Ram的倒数第二行:33d009a8: e3a00000 movr0, #0 ; 0x0 是把0赋值给r0寄存器,就是我们说的返回值的传递,此处的返回值为0,也对应着C代码中的“ return

    1.2K10

    C语言为什么需要include就能使用里面声明的函数?

    有人问:C语言为什么需要include就能使用里面声明的函数?这是一个看起来非常简单的问题,但是很多初学者,甚至学了很久的人都可能没有搞明白。 为什么包含即可用?...//hello.c #include int main(void) { printf("hello,编程珠玑\n"); return 0; } 这一点也很容易验证: $...所以实际上,你只是在你的.c中声明了这些函数,既然声明了,那么你就可以使用。但是你要想真正用到它,还需要找到它的定义。这是在链接阶段做的事情。...链接的时候,链接器会知道,诶,你这个程序需要printf函数啊?好的,我去libc.so里面找找,看看有没有哈。,巧了,还真有,恭喜你可以用。...(-lm表示需要链接math库) 当然了,对于C++,使用pow函数不用链接math库也是可以的,为什么呢?请移步这里《C++为什么需要单独链接math库?》。 不包含可以用吗?

    1.3K20

    Rust投稿】捋捋 Rust 中的 impl Trait 和 dyn Trait

    Rust 之所以要求函数不能返回多种类型是因为 Rust需要在 编译期确定返回值占用的内存大小, 显然不同类型的返回值其内存大小不一定相同....为什么 Box 形式的返回值会被废弃而引入了新的 dyn 关键字呢? 埋坑 impl Trait 和 dyn Trait 在 Rust 分别被称为静态分发和动态分发....通过单态化, 编译器消除了泛型, 而且没有性能损耗, 这也是 Rust 提倡的形式, 缺点是过多展开可能会导致编译生成的二级制文件体积过大, 这时候可能需要重构代码....那么问题来了, 为什么编译器会提示 Box 会被废弃, 特地引入了 dyn 关键字呢? 答案可以在 RFC-2113 中找到....又因 trait object 与 Trait 在不引入 dyn 的情况下经常导致语义混淆, 所以 Rust 特地引入 dyn 关键字, 在 Rust 2018 中已经稳定.

    2.6K10

    我的 7 大 Rust 关键字

    我仍然喜欢它,并认为谈论一些在 Rust 中反复出现的重要关键字可能会有好处。...我会提供我个人对它们的作用的总结:为什么需要考虑如何使用它们,以及任何其他有用的东西,特别是对于刚接触 Rust 的新手或来自另一种语言的人(如 Java;请阅读我的文章 为什么作为一个 Java 程序员的我喜欢学习...return – 实际上我很少使用 return,它用于从函数中返回一个值,但是如果你只是在函数的最后一行提供值(或提供返回值的函数),通常会变得更简单,能更清晰地阅读。...unsafe – 如其意:如果你想做一些不能保证 Rust 内存安全的事情,那么你就需要使用这个关键字。...use – 当你想使用另一个 crate 中的东西时,例如结构体、变量、函数等,那么你需要在你要使用它的代码的代码块的开头声明它。

    57420

    【翻译】Rust中的尾递归优化的故事

    Python不支持[5],Rust也不支持。 在深入探究为什么会这样之前,让我们简要地总结一下尾调用优化背后的思想。...TCO的目标就是通过一种不需要为每个调用分配栈帧的方式运行尾递归函数来消除这种线性内存占用。 一种实现方式就是让编译器来做这件事,一旦编译器发现需要执行TCO,就把尾递归函数执行转换成一个迭代循环。...这意味着尾递归函数的结果只需要占用单个栈帧就能计算出来。内存使用为常量。 ? 有了上面这些知识,让我们回来看看,为什么Rust没有做TCO。...,这和前面提到的become关键字一样改进了相同的行为:它允许程序员通过迭代循环提示Rust运行时执行指定的尾递归函数,从而将函数的内存开销降低到一个常数级别。 rec_call!...tramp.rs是我们需要来在Rust编程中启用按需TCO的英雄,对么? 恐怕不是这样。

    2K20

    自从尝了 Rust,Java 突然不香了

    Rust 官网链接:https://www.rust-lang.org/ 1为什么 Rust 受到许多开发者的青睐? Rust 具有更强大的高并发性和高安全性,堪称栈溢出开发的完美选择。...Rust 的语法与 C 和 C++ 编程有很多相似之处,比如 if-else、while、for、return关键字的用法,而 Rust 中一些关键字还使用了模式匹配技术,这使得这门语言更容易上手。...如果你需要对一个数据值进行初始化,那么只能通过一系列固定的形式来完成初始化,它要求在函数开始前初始化所有的输入。...非传统的特性 Rust 还引入了一些额外添加的语法和功能来管理函数本身的生命周期,另一个方面,如果需要编写一些不安全的代码,可以使用 Unsafe Rust 功能来对其进行限制,而所有权功能作用于所有的值...值可以通过不可变引用关键字 &T 进行传递,也可以通过可变引用关键字 &mut T 来完成传递。Rust 编译器在编译时执行这些规则,并同时追踪所有引用的有效性。

    1K30

    Rust流程控制

    除了以下几种语法: 变量声明 模块声明 函数声明 结构体声明 枚举声明 … 你可能会奇怪为什么 if…else… 不在上面的列表中,事实上,在 Rust 中,条件与循环并不是语句,而是表达式,这意味着它可以有返回值..., a); ---- if-else选择结构 Rust 中的 if-else 语法与其他语言类似,与许多语言不同,if 后的布尔条件不需要用括号括起来。...("{}", m); } ---- 使用loop循环 Rust 提供了一个 loop 关键字来表示无限循环。...例如如下的斐波那契函数: fn fibonacci(n: u64) -> u64 { if n < 2 { return n; } return fibonacci...(n - 1) + fibonacci(n - 2); } 方法 方法是附加到对象的函数,这些方法可以通过 self 关键字访问对象及其其他方法的数据。

    56310
    领券