如何将 Box<dyn Error + Sync + Send> 转换为 Box<dyn Error>

     2023-02-19     166

关键词:

【中文标题】如何将 Box<dyn Error + Sync + Send> 转换为 Box<dyn Error>【英文标题】:How to convert Box<dyn Error + Sync + Send> to Box<dyn Error> 【发布时间】:2020-03-26 14:16:52 【问题描述】:

在我的程序中,在辅助线程上执行了一些操作及其结果:Result&lt;(), Box&lt;dyn Error&gt;&gt; 被发送回主线程。对于具有Send 要求的错误来说,这是非常合理的,因此实际类型是Result&lt;(), Box&lt;dyn Error + Send&gt;&gt;。我还添加了Sync 以便能够使用Box from 方法(仅针对普通或同步+发送实现)。但是在单线程上解决结果后,我想放弃这个要求。

例子:

use std::error::Error;

fn test1() -> Result<(), Box<dyn Error + Sync + Send>> 
    return Err("test1".into());

fn test2() -> Result<(), Box<dyn Error>> 
    test1()?;
    return Ok(());

fn main() 
    let test2_result = test2();
    println!("test2_result: :#?", test2_result);

最后我实际上是这样结束的:

   Compiling playground v0.0.1 (/playground)
error[E0277]: the size for values of type `dyn std::error::Error + std::marker::Send + std::marker::Sync` cannot be known at compilation time
 --> src/main.rs:7:12
  |
7 |     test1()?;
  |            ^ doesn't have a size known at compile-time
  |
  = help: the trait `std::marker::Sized` is not implemented for `dyn std::error::Error + std::marker::Send + std::marker::Sync`
  = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
  = note: required because of the requirements on the impl of `std::error::Error` for `std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>`
  = note: required because of the requirements on the impl of `std::convert::From<std::boxed::Box<dyn std::error::Error + std::marker::Send + std::marker::Sync>>` for `std::boxed::Box<dyn std::error::Error>`
  = note: required by `std::convert::From::from`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0277`.
error: could not compile `playground`.

To learn more, run the command again with --verbose.

这些类型似乎不兼容。

那么我怎样才能将(例如在test2Result&lt;(), Box&lt;dyn Error + Send&gt;&gt; 转换为Result&lt;(), Box&lt;dyn Error&gt;&gt;

我知道这可以通过创建包装器来完成,但我不想添加下一级间接。

【问题讨论】:

if let Err(e) = test1() return Err(e); 可以工作。 看来向上转换 trait 对象是个问题,见***.com/questions/28632968/… 【参考方案1】:

如何在这两种类型之间转换的问题仍然悬而未决。

现在我切换到https://crates.io/crates/failure crate 进行错误处理,其中Error 类型替换Box&lt;dyn Error + Sync + Send&gt;,也可以轻松创建自定义和字符串(甚至格式化)错误。

【讨论】:

如何将 Rc<RefCell<dyn T>> 传递给想要 &dyn T 的 fn?

】如何将Rc<RefCell<dynT>>传递给想要&dynT的fn?【英文标题】:HowtopassRc<RefCell<dynT>>tofnthatwants&dynT?【发布时间】:2020-05-2620:05:23【问题描述】:我无法将参数传递给fn。traitTstructSothers:Vec<Rc<RefCell<dynT>&... 查看详情

如何将盒装切片 (`Box<[T]>`) 传递给 C 函数?

】如何将盒装切片(`Box<[T]>`)传递给C函数?【英文标题】:Howtopassaboxedslice(`Box<[T]>`)toaCfunction?【发布时间】:2017-01-1220:50:47【问题描述】:我想向C函数公开一个“动态数组”。C函数将拥有数据,稍后将调用我的函数来释... 查看详情

如何将文本添加到 Fancy Box Loader

】如何将文本添加到FancyBoxLoader【英文标题】:HowtoaddtexttoFancyBoxLoader【发布时间】:2014-10-1317:33:00【问题描述】:单击链接时,我需要在FancyBox叠加层上加载一个巨大的pdf。在加载pdf之前,我正在显示一个FancyBox加载器。问题是... 查看详情

如何将两个相邻的div合并为一个?(代码片段)

HTMLDOM<divclass="box-1">...</div><divclass="box-2">...</div>我可以使用JavaScript删除</div><divclass="box-2">的这一部分吗?任何帮助,谢谢!答案我认为它正在运行varelmnt1=document.getElementsByClass 查看详情

小程序中如何将view按照百分比,实现等宽高效果(代码片段)

1、布局<ViewclassName='Box'> <ViewclassName='Box1'> <ViewclassName='Box2'></View> </View></View>2、wxss.Boxdisplay:flex;justify-con 查看详情

如何从“盒子”中获得拥有的价值?

】如何从“盒子”中获得拥有的价值?【英文标题】:HowdoIgetanownedvalueoutofa`Box`?【发布时间】:2017-07-0423:30:17【问题描述】:这个函数的实现是什么:fnunbox<T>(value:Box<T>)->T//???文档中唯一看起来像我想要的函数是Box::in... 查看详情

如何将css中div下面的文字移置上一个div的右侧?

我试着将上一行的div移置下一行的div中还是不行,有没有其他的解决办法,在线求?<style>.boxdisplay:flex;width:1000px;margin:0auto;background-color:#f4f4d0;.box.leftflex:10auto;.box.leftulwidth:140px;margin:50pxauto;padding:0;.box.leftulliheight:40px;list-style-ty... 查看详情

出现错误:不能将 Box<dynamic>' 分配给参数类型 'ValueListenable<dynamic>'

】出现错误:不能将Box<dynamic>\\\'分配给参数类型\\\'ValueListenable<dynamic>\\\'【英文标题】:Gettingerror:Box<dynamic>\'can\'tbeassignedtotheparametertype\'ValueListenable<dynamic>\'出现错误:不能将Box<dynamic>\'分配给参数类型\ 查看详情

将jquery对象视为数组

/*Here'ssomesampleHTMLfollowedbysomejQuerythatallowsustoaccessthevaluesofany"box"byindex.*/<divid="wrapper"><divclass="box">Content#1!</div><divclass="box">Content#2!</div><divclass="box">Content#3!</div><... 查看详情

(c++) 如何有效地制作升序(dyn.solution)

】(c++)如何有效地制作升序(dyn.solution)【英文标题】:(c++)Howtoeffectivelymakeascendingsequences(dyn.solution)【发布时间】:2016-11-1209:14:26【问题描述】:我目前正在尝试制作一个涉及升序的程序。N为序列的大小,K为最大数,例如输入... 查看详情

jquery操作(代码片段)

...JavaScript操作的可以是效果是相同,但是更为简单高效,将常用的操作封装成为函数。选择器eg:$(‘.box‘)得到的是一个存放原生js对象的数组,就是jq对象,页面中有多少个.box,该jq对象就承载者多少个对象,.可以作为一个整体来使用&... 查看详情

如何使用onscroll

<divid="box1">  <divid="box2">  </div></div>oncroll一定要有滚动条的时候才能用。。。。可以给定位父级加:overflow:auto,并且box2的高度要大于box1定位父级:display:absolute; 相对定位     display:relative; &nb... 查看详情

如何将obj与类名与jquery匹配

】如何将obj与类名与jquery匹配【英文标题】:howtomatchobjwithclassnamewithjquery【发布时间】:2021-10-2204:22:15【问题描述】:在这种情况下,我将div描述为一个带有方形和圆形孔的盒子。盒子:<divid="box"><divclass="square"></div&g... 查看详情

如何将 Vagrant box 转换为 Docker 镜像

】如何将Vagrantbox转换为Docker镜像【英文标题】:HowtoconvertaVagrantboxtoaDockerimage【发布时间】:2015-09-2800:58:15【问题描述】:我看到可以将Docker映像转换为Vagrant盒子。有没有办法将Vagrantbox转换为Docker镜像?【问题讨论】:【参考... 查看详情

盒子的浮动(代码片段)

 <!doctypehtml><html><head><metacharset="utf-8"><title>sy5-2</title></head><styletype="text/css">.box1width:100px;height:100px;background-color:bl 查看详情

如何使 Rust Generic Struct/Trait 需要 Box<other trait>?

】如何使RustGenericStruct/Trait需要Box<othertrait>?【英文标题】:HowtomakeaRustGenericStruct/TraitrequireaBox<othertrait>?【发布时间】:2021-10-0116:40:17【问题描述】:我有一个特征Agent代表模拟中的代理,还有一个结构SimpleAgent实现了这... 查看详情

如何自动将搜索字段添加到导航菜单|wordpress

Placesnippetinfunctions.phpadd_filter('wp_nav_menu_items','add_search_box',10,2);functionadd_search_box($items,$args){ ob_start();get_search_form();$searchform=ob_get_contents();ob_end_clean(); $items.='<li>'.$searchform.'</li&g... 查看详情

如何通过jquery将消息设置为p:messages组件?(代码片段)

我有以下p:messages组件:<p:messagesid="messageId"autoUpdate="true"closable="true"redisplay="false"/>我需要使用jQuery在其中显示一条消息:jQuery(#messageId).val("Errormessage");这可能吗?答案$('messageId').append('<divclass="ui-messages-errorui-corner-all">&l... 查看详情