我有一个get_url_content函数,不在乎错误(这只是一个测试).它返回一个Option<String>.

extern crate hyper;

use std::io::Read;
use hyper::client::Client;

fn get_url_content(url: &str) -> Option<String> {
    let client = Client::new();
    let mut s = String::new();

    match client.get(url).send() {
        Ok(mut res) => {
            match res.read_to_string(&mut s) {
                Ok(_) => {
                    Some(s)
                },
                Err(_) => {
                    None
                }
            }
        },
        Err(_) => {
            None
        }
    }
}

这个函数很好用,但我发现它不容易阅读.我认为有一些关于此类 case 的最佳实践可以让它更具可读性.嵌套匹配是否是一种糟糕的做法(比如JS中的回调地狱),如果是,如何避免?

推荐答案

让事情变得更干净的最简单方法是放下一些支架:

match client.get(url).send() {
    Ok(mut res) =>
        match res.read_to_string(&mut s) {
            Ok(_) => Some(s),
            Err(_) => None,
        },
    Err(_) => None,
}

内在的匹配可以表达得更清晰一点,也许是

match client.get(url).send() {
    Ok(mut res) =>
        res.read_to_string(&mut s).ok().map(|_| s),

    Err(_) => None,
}

这建议在外部类型上使用map(得到Result<Option<_>, _>),然后将结果与.unwrap_or(None).unwrap_or_default()一起删除

client.get(url).send()
      .map(|mut res| res.read_to_string(&mut s).ok().map(|_| s))
      .unwrap_or(None)

Rust相关问答推荐

抽象RUST中的可变/不可变引用

值为可变对象的不可变HashMap

如何格式化传入Rust中mysql crate的Pool::new的字符串

如何导入crate-type=[";cdylib;]库?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

如何计算迭代器适配器链中过滤的元素的数量

取得本地对象字段的所有权

重写Rust中的方法以使用`&;mut self`而不是`mut self`

当对VEC;U8>;使用serde_json时,Base64编码是保护空间的好方法吗?

AXUM一路由多个不包括URL的参数类型

由于生存期原因,返回引用的闭包未编译

为什么我需要 to_string 函数的参考?

相当于 Rust 中 C++ 的 std::istringstream

‘&T as *const T as *mut T’ 在 ‘static mut’ 项目中合适吗?

从Rust 的临时文件中创建引用是什么意思?

为什么不可变特征的实现可以是可变的?

判断 is_ok 后重用结果

在 Rust 中获得准确时间的正确方法?

你能用 Rust 和 winapi 制作 Windows 桌面应用程序吗?

守卫如何影响匹配语句?