gpt4 book ai didi

rust - 如何在接受 `Box` 的地方接受 `Box` ?

转载 作者:行者123 更新时间:2023-11-29 08:31:36 25 4
gpt4 key购买 nike

我可以接受 Box<dyn Error + Send> 吗?在接受 Box<dyn Error> 的地方?如果是,如何?如果不是,为什么,还有比以下示例更优雅的方法吗?

#![allow(unused)]

use std::error::Error as StdError;
use std::result::Result as StdResult;

type Result = StdResult<(), Box< dyn StdError >>;
type SndResult = StdResult<(), Box< dyn StdError + Send >>;

fn fn_returning_result() -> Result { Ok(()) }
fn fn_returning_sndresult() -> SndResult { Ok(()) }

/// Accept a callback that returns a non-Send `Result`.
fn register_callback<CB: FnOnce() -> Result>(cb: CB) { /* ... */ }

fn main() -> Result {
// Is there a way to get rid of ... vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv ... this part?
let cb = || fn_returning_sndresult().map_err(|e| -> Box<dyn StdError> { e });
register_callback(cb);

Ok(())
}

Playground

编辑:我想在这里做的只是 let cb = || fn_returning_sndresult(); ,但不会编译。

此外,我想调用 fn_returning_result()?fn_returning_sndresult()?在具有单一返回类型且不执行 map_err 的回调中.

最佳答案

这是基于我得到的答案 on Reddit通过 Llaurence_:

我可以改变register_callback接受两个 Box<dyn Error>Box<dyn Error + Send>通过使错误类型通用来产生错误:

fn register_callback<CB, E>(cb: CB)
where
CB: FnOnce() -> StdResult<(), Box<E>>,
E: StdError + ?Sized,
{ /* ... */ }

现在我可以传递一个返回任何一种错误/结果的回调:

register_callback(fn_returning_result);
register_callback(fn_returning_sndresult);

关于rust - 如何在接受 `Box<dyn Error + Send>` 的地方接受 `Box<dyn Error>` ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56330705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com