Rust 中使用 return 语句和省略分号有什么区别?

2024-03-24

我正在编写一个函数,该函数在成功(和失败)时返回 serde_json::Value 。以前在 Rust 中,我一直省略分号来从函数返回数据,如下面的代码示例所示:

use serde_json::{Result, Value};
use core::result::Result as ResultCore;

fn returning_function() -> ResultCore<Value, Value> {
    let data = r#"
    {
        "status": "ok",
        "response": {
            "data": "secret message!"
         }
    }
    "#;

    match str_to_json(data) {
        Ok(json_data) => match json_data["status"].as_str() {
            Some(status_str) => {
                if status_str == "ok" {
                    Ok(json_data["response"].clone())
                }
            }
            None => eprintln!("\"status\" was not a string")
        }
        Err(error) => eprintln!("something went wrong! here's what: {}", error)
    }

    Err(serde_json::Value::Null)
}

fn str_to_json(json_data: &str) -> Result<Value> {
    Ok(serde_json::from_str(json_data)?)
}

这是我不明白的部分:这无法编译。 Rust 的编译器告诉我“类型不匹配”,并且它expected type (), but found type serde_json::value::Value。现在,我找到了一个可以编译的解决方案,如下所示:

use serde_json::{Result, Value};
use core::result::Result as ResultCore;

fn returning_function() -> ResultCore<Value, Value> {
    let data = r#"
    {
        "status": "ok",
        "response": {
            "data": "secret message!"
         }
    }
    "#;

    match str_to_json(data) {
        Ok(json_data) => match json_data["status"].as_str() {
            Some(status_str) => {
                if status_str == "ok" {
                    return Ok(json_data["response"].clone());
                    // ^ added return statement here
                }
            }
            None => eprintln!("\"status\" was not a string")
        }
        Err(error) => eprintln!("something went wrong! here's what: {}", error)
    }

    Err(serde_json::Value::Null)
}

fn str_to_json(json_data: &str) -> Result<Value> {
    Ok(serde_json::from_str(json_data)?)
}

通过添加return声明编译器突然很高兴并且编译器不再对此有任何可说的。为什么是这样?我的印象是省略分号和使用 return 语句具有相同的含义 - 为什么这里有所不同?


A return语句,也称为早期返回,将从最后一个/最里面的类似函数的范围返回一个对象。 (类似于函数,因为它同时适用于闭包和函数)

let x = || {
    return 0;
    println!("This will never happen!");
};
fn foo() {
    return 0;
    println!("This won't happen either");
}

不存在的分号将代替计算表达式,就像return,但只返回到最后一个/最里面的范围,或者换句话说,它从任何一组范围内返回{}.

let x = {           // Scope start
    0
};                  // Scope end

fn foo() -> usize { // Scope start
    0
}                   // Scope end

return语句将突破任意数量的嵌套作用域,直到它到达类似函数的作用域:

fn foo() -> usize {// <------------------------------------------\
    {                                                      //    |
        {                                                  //    |
            {                                              //    |
                {                                          //    |
                    {                                      //    |
                        {                                  //    |
                            {                              //    |
                                {                          //    |
                                    {                      //    |
                                        {                  //    |
                                            {              //    |
                                                 return 0; // ---/
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

The return语句也有自己的类型,也就是说let x = return;实际上会编译。

return 语句的计算结果为!, AKA 从不类型 https://doc.rust-lang.org/std/primitive.never.html。你现在还不能用稳定的 Rust 来命名它,但它最终会变得稳定且可用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中使用 return 语句和省略分号有什么区别? 的相关文章

随机推荐

  • 如何通过另一种方法动态地将元素添加到反应器热通量中?

    我有一个数据源服务 它接受观察者作为参数 void subscribe Consumer onEventConsumer 我想使用 Flux 作为 RSocket 的响应流 我怎样才能做到这一点 我现在看到的应该是这样的 Flux
  • C# 中文字的算术运算是否在编译时计算?

    非常简短的问题 但我现在无法在网上找到解决方案 int test 1 2 Will 1 2在运行时或编译时执行 询问原因 我认为大多数人有时会使用文字而不指定其使用原因或含义 因为他们不想通过运行计算来浪费一点性能 并且我相信计算发生在编译
  • 无法访问 Azure 文件共享 |端口 445

    我已经设置了 Azure 存储文件 并在我的开发计算机中添加了一些防火墙规则来打开端口 445 但我现在无法访问我的文件共享 它也不响应 ping 命令 但我可以从 Azure VM IaaS 服务器访问相同的文件共享 有什么我错过的吗 不
  • ASP.NET MVC 3 - 如何从数据库填充单选按钮列表

    在 Asp net MVC 3 中 我的单选按钮设置如下 div class editor label Html LabelFor m gt m Roles div div class editor field Html RadioButt
  • 从 iOS 14 小部件的 CoreData 获取数据

    我想在小部件中显示从核心数据获取的数据 但 FetchRequest不适用于小部件 据我了解 我们必须创建一个应用程序组并创建一个共享的持久容器 我想知道的是如何从共享的持久容器中读取 获取 小部件上的数据 或者简单地 如何在小部件中显示从
  • Sublime Text 3 控制台中的 Unicode 编码错误

    我总是得到一个 UnicodeEncodeError ascii 编解码器无法对位置 0 处的字符 xf6 进行编码 序号不在范围 128 中 当尝试打印非 ASCII 字符时 在 Sublime Text 3 控制台中 我正在使用 Ana
  • 如何使用 NetworkX 获得加权图中的最短路径?

    我试图在定义为的加权图中获得最短路径 import networkx as nx import matplotlib pyplot as plt g nx Graph g add edge 131 673 weight 673 g add
  • Sugar ORM for Android 找不到我的列名

    好吧 我正在尝试选择所有实体entitie id some id 我用这个规则来做到这一点 List
  • TinyMCE 4 与 elFinder

    有人已经尝试将 elFinder 集成到新的 4b1 版本的 TinyMCE 中吗 看起来像previous http www tinymce com wiki php how to implement a custom file brow
  • 按特定顺序对(数组)列表进行排序

    我有一个对象列表 我想按照定义的顺序对其进行排序 对于前 我有一个带有字段的对象String color 我想在颜色字段上对我的列表进行排序 以便它总是首先是白色 然后是蓝色 然后是黄色 然后是所有其他 如果可能的话 alpha order
  • 在 Java 中使用 PrinterJob 打印 PDF 文件

    我在尝试使用 Java 打印 PDF 文件时遇到问题 这是我的代码 PdfReader readFtp new PdfReader This class is used for reading a PDF file PDDocument d
  • 有什么方法可以通过某个索引将数据绑定到 data.frame 吗?

    For say I got a situation like this user id c 1 5 1 5 time c 1 10 visit log data frame user id time And I ve wrote a met
  • 在 Mono 中,如何获取 Mac (Snow Leopard) 上的 Documents 文件夹的路径?

    我正在编写一个 Mono 应用程序 并且想找到 Documents 文件夹的完整路径 例如 Users johnsmith Documents 实现这一目标的最佳方法是什么 你可以这样做 string doc path Path Combi
  • 在 Kotlin Flow 中使用 ReactiveSecurityContextHolder

    我正在使用 Kotlin 开发 Spring Boot 2 2 项目 使用 CouchDB 作为 反应式 数据库 因此使用异步 DAO 挂起函数或返回 Flow 的函数 我正在尝试设置 WebFlux 以便也拥有异步控制器 同样 我想返回
  • k8s hpa无法获取cpu信息[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我设置了 hpa 使用命令 sudo kubectl autoscale deployment e7 build 64 cpu perce
  • 使用QTWebKit显示内存中存储的网站

    目前我将 HTML JS CSS 图形等存储在本地硬盘上 并使用QWebFrame SetUrl QUrl fromLocalFile appFolder html index html 在某些时候 我需要加密本地存储的文件 因此我正在寻找
  • 如何用 PHP 可靠地发送电子邮件?

    我正在学习如何发送电子邮件 我已经安装了应用程序服务器并在文件中 php ini dist 和 php ini recommended 我做了以下更改 SMTP localhost email protected cdn cgi l ema
  • 单击按钮后将焦点置于特定 div 上

    我在页面中有一个表格 用于在特定舞台上注册各种娱乐节目 提交所有详细信息并单击提交按钮后 应检查特定日期该阶段是否存在节目 如果存在任何程序 div 应该显示现有程序的完整详细信息 我的问题是 如果存在任何程序 我需要将焦点放在新生成的 d
  • 计算热门话题

    假设我根据各种标准从 twitter 收集推文并将这些推文存储在本地 mysql 数据库中 我希望能够计算出 twitter 等热门话题 长度可以是 1 3 个单词 是否可以编写一个脚本来执行类似 PHP 和 mysql 的操作 我找到了答
  • Rust 中使用 return 语句和省略分号有什么区别?

    我正在编写一个函数 该函数在成功 和失败 时返回 serde json Value 以前在 Rust 中 我一直省略分号来从函数返回数据 如下面的代码示例所示 use serde json Result Value use core res