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

【Rust学习】21_错误处理_Result

当无法创建文件时,将打印不同的错误消息。外部match第二个分支保持不变,因此程序会因除缺少文件错误之外的任何错误都会抛出异常。...在下面的例子中,我们将 main 的返回类型更改为ResultBoxdyn Error>>并在末尾添加了返回值 Ok(()),这样后这个代码就能编译了。...; Ok(())}Boxdyn Error> 类型是一个 trait 对象,您可以将 Boxdyn Error> 读作“任何类型的错误”。...在具有错误类型为 Boxdyn Error> 的main函数中使用 ?是允许的,因为它允许提前返回任何 Err 值。...即使此 main 函数的主体只会返回 std::io::Error 类型的错误,但通过指定 Boxdyn Error>,即使将更多返回其他错误的代码添加到 main 主体中,此签名也将继续正确。

8310

Rust特征对象(Trait Object)

("f64: {}", *self) } } // 若 T 实现了 Draw 特征, 则调用该函数时传入的 Box 可以被隐式转换成函数参数签名中的 Boxdyn Draw> fn draw1...// x 和 y 的类型 T 都实现了 `Draw` 特征,因为 Box 可以在函数调用时隐式地被转换为特征对象 Boxdyn Draw> // 基于 x 的值创建一个 Box函数的参数是 Boxdyn Draw> 形式的特征对象,该特征对象是通过 Box::new(x) 的方式创建的 draw2 函数的参数是 &dyn Draw 形式的特征对象,该特征对象是通过...例如: // 若 T 实现了 Draw 特征, 则调用该函数时传入的 Box 可以被隐式转换成函数参数签名中的 Boxdyn Draw> fn draw1(x: Boxdyn Draw>) {...("Clone"); } 变异含有该函数的代码时,会发生如下错误。

1K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Rust错误处理

    运算符时,如果表达式的结果是一个错误值,那么整个函数将立即返回这个错误值,否则会将表达式的结果进行包装并继续执行函数。?...的强大之处在于自动类型提升,例如: fn main() { fn open_file() -> ResultBoxdyn std::error::Error>> { let mut...实际上 Rust 还支持另外一种形式的 main 函数: use std::error::Error; use std::fs::File; fn main() -> ResultBoxdyn...提前返回了,同时我们又一次看到了Boxdyn Error> 特征对象,因为 std::error:Error 是 Rust 中抽象层次最高的错误,其它标准库中的错误都实现了该特征,因此我们可以用该特征对象代表一切错误...,就算 main 函数中调用任何标准库函数发生错误,都可以通过 Boxdyn Error>这个特征对象进行返回.

    70420

    【翻译】Rust生命周期常见误区

    Trait 不管怎样,这都值得我们仔细研究,因为新手们经常在将一个使用trait对象的函数重构成使用泛型的函数(或者反过来)的时候感到困惑。...>(t: T) -> Boxdyn Display> { Box::new(t) } 抛出如下错误: error[E0310]: the parameter type `T` may not...Box::new(t) } 这个函数接收的参数和前一个版本一样,但多了不少东西。...(str_ref); // 编译错误,和我们预期的一样 } 这里的问题在于,当你将一个可变引用重新借用为共享引用,你会遇到一点麻烦:即使可变引用已经析构,重新借用出来的共享引用还是会将可变引用的生命周期延长到和自己一样长...&i32| x; // 可以通过将它分配在堆上来绕过这个错误,但这样很笨重 let identity: Boxdyn Fn(&i32) -> &i32> = Box::new(|x

    1.6K20

    【Rust日报】2019-09-14 - Rust Bay Area Meetup视频发布

    只要它不支持压缩流中定义的参数,它就必须产生一个非模糊的错误代码和相关的错误消息,说明那个参数不受支持。 目前此rust工程已经能够做到: 解析/ decodecorpus_files中的所有文件。...这些是由原始zstd开发人员使用decodecorpus生成的 将所有这些都正确解码到输出缓冲区 解码我在本地创建的所有decode_corpus文件(1000+) 更多信息可以前往GitHub上浏览。.../ collection of boxed trait objects 想要一个可以对这个特征对象的泛型集合进行操作的函数,但将迭代器作为参数传递是否是一个正确的方法呢?...Sized, { ... } 如何编写一个可以使用I类型的Iterator的单个函数?有更好的方法吗? 下列代码解决了上述问题,且未添加任何trait的实现。...dyn Get>>::new(); v2.push(Box::new(Foo(123))); v2.push(Box::new(Foo(321))); sum_from_iter

    41820

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

    , 并且还贴心的提示我们把 Box 改成 Boxdyn View>, 按编译器的提示修改代码, 此时代码 no warning, no error, 完美....但 impl Trait 和 Boxdyn Trait> 除了允许多种返回值类型的之外还有什么区别吗? trait object 又是什么?...为什么 Box 形式的返回值会被废弃而引入了新的 dyn 关键字呢? 埋坑 impl Trait 和 dyn Trait 在 Rust 分别被称为静态分发和动态分发....静态分发, 正如静态类型语言的"静态"一词说明的, 在编译期就确定了具体调用类型. Rust 编译器会通过单态化(Monomorphization) 将泛型函数展开....至此 Box 终于出现了. 那么问题来了, 为什么编译器会提示 Box 会被废弃, 特地引入了 dyn 关键字呢? 答案可以在 RFC-2113 中找到.

    2.6K10

    Rust 开发命令行工具(上)

    错误值是一个包装了实现了 std::error::Error trait 的错误对象的 Box。...可以将对应的代码部分改成如下格式: fn main() -> ResultBoxdyn std::error::Error>> { let content = std::fs::read_to_string...例如,我们main函数中的错误类型是Boxdyn std::error::Error>。但是我们已经看到read_to_string返回的是std::io::Error。这是因为?...扩展为转换错误类型的代码。 ❞ ❝同时,Boxdyn std::error::Error>也是一个有趣的类型。它是一个Box,可以包含任何实现标准Error trait的类型。...这意味着基本上所有错误都可以放入这个Box中,因此我们可以在所有通常返回Result的函数上使用?。 ❞ 有关Box的使用原理和介绍可以参考Rust智能指针 ---- 为错误提供合适的语境提示 使用?

    82240

    Rust采集天气预报信息并实时更新数据

    use std::net::TcpStream;use std::io::prelude::*;use std::error::Error;​fn main() -> ResultBoxdyn...std::net::TcpStream是用来建立网络连接的,std::io::prelude::*导入了一些预定义的IO操作函数,std::error::Error是Rust中定义错误类型的标准库。...这个函数会返回一个Result,如果连接成功,就返回一个Ok,包含一个TcpStream类型的值,表示连接的套接字。如果连接失败,就返回一个Err,包含一个表示错误的值。...每次读取,我们都使用stream.read函数,这个函数会返回一个Result,如果读取成功,就返回一个Ok,包含读取到的数据的长度,如果读取失败,就返回一个Err,包含一个表示错误的值。...如果在运行过程中发生错误,我们就返回一个Boxdyn Error>类型的值,表示错误。

    13710

    nydusd 源码理解(二)

    DAEMON_CONTROLLER 初始化 接上文 nydusd 源码理解(一),回到process_fs_service函数,创建daemon实例完成后,替换DAEMON_CONTROLLER中daemon...取而代之,尽早创建对象(比如在 main 函数中),然后将对该对象的可变引用传递到需要它的位置。 lazy_static!...是给静态变量延迟赋值的宏,所有static类型的变量会在第一次被使用时初始化,并且只初始化一次。初始化包括分配需要的堆,如vector或hash map,和非常量函数调用。...回到 main() 函数中,接下来设置默认的fs service: let daemon = DAEMON_CONTROLLER.get_daemon(); if let Some(fs) = daemon.get_default_fs_service...start_http_thread() 方法传入的参数包括 apisock 和两个 channel 的 to_handler(用于向ApiServerHandler发送消息)和 from_handler

    1.1K00

    Rust 错误处理

    如果将 0 作为 crew_size 传给此函数,那么它将除以 0。在 C++ 中,这将是未定义行为。而在 Rust 中,这会触发 panic,通常会按如下方式处理。 把一条错误消息打印到终端。...// /// 如果在构建此错误消息或将其写入`stderr`期间发生了另一个错误,就忽略新的错误 fn print_error(mut err: &dyn Error) { let _ = writeln...如果是错误结果,那么它会立即从所在函数返回,将错误结果沿着调用链向上传播。为了确保此操作有效,? 只能在返回类型为 Result 的函数中的 Result 值上使用。 ? 运算符并无任何神奇之处。...所有标准库中的错误类型都可以转换为类型 Boxdyn std::error::Error + Send + Sync + 'static>。...type GenericError = Boxdyn std::error::Error + Send + Sync + 'static>; type GenericResult = Result

    11810

    `操作符是如何“抽象”错误类型与“短路”函数的

    操作符是如何“抽象”错误类型与“短路”函数的 首先,?操作符是被用来勾连·函数体内Result·与·函数返回值类型Result·的【语法糖】。...操作符前Result中的E1·类型转换·为【函数】返回值类型Result中的E2。 再“短路”当前执行函数和退出函数。...【函数】返回值类型Result中的E2是一个“同时兼容于所有其它错误类型的、统一的【“抽象”错误类型】”。...按其“抽象”方式分为如下两种情况: 上面两种方式都能把·从函数体内抛出的·不同类型的·错误,经由?操作符,收拢于“一处”。 在这里,我把【类型转换】称为“抽象”是否有些牵强呀?...E2就是Boxdyn Error>,因为【标准库】给Box实现了FromError> trait。其本质也是【类型转换】。 这个,我一直以来使用得比较多。

    1.6K10
    领券