首页 > 解决方案 > 如何指定在某些特征边界下满足给定第一个特征的任何类型也必须隐式满足第二个特征?

问题描述

我有与Unable to tokio::run a boxed Future 类似的情况,因为不满足 trait bound Send):我想在where没有实现tokio::run的类型上使用。Box<T: Future ...>TSend

我的情况不同,因为我没有编写返回 my 的方法Box,因此无法更改其方法签名。它执行一个网络请求并返回这个装箱的未来:

pub fn get_resource(&self,) -> Box<Future<Item = RestStruct, Error = Error<serde_json::Value>>>

注意缺少Send.

根据Tokio 文档,我需要Send在我的盒装类型上实现,即使未来的关联类型是Send

精明的读者可能会注意到定义中明确的Send特征符号Box。添加符号是因为默认情况下Future未明确显示Send;这会在稍后尝试将此未来或其衍生物之一传递给tokio::run.

我很难找到一种适当简洁的方法来做到这一点。似乎这些方面的东西应该起作用:

impl<T, I, E> Send for T
where
    T: Future<Item = I, Error = E>,
    I: Send,
    E: Send,
{
}

我得到了一些令人惊讶的错误。我将在下面详细说明它们,但我的问题可以笼统地说,我如何指定:在某些特征范围内满足给定第一个特征的任何类型也必须隐式满足第二个特征


我的解决方案产生的错误:

该特征std::marker::Send需要unsafe impl声明

我想我理解的是基于关于的文档Send,但要澄清:这确实构成了那里描述Send的“正确实现” ,因为相关的类型是?Send

类型参数T必须用作某些局部类型的类型参数(例如,MyStruct<T>

我理解这与文档中描述的新类型解决方法有关,如果是这样的话,这真的会妨碍我做我想做的事情。这是否意味着我无法完成我想要的?有没有类似有界特征的类型别名可以解决这个问题?

std::marker::Send类型特征的冲突实现&_

那个,完全看不懂。&_比我尝试使用所有这些where边界指定的受约束类型要广泛得多;我不希望&_Future<Item = I: Send, Error = E: Send>

标签: rusttraitsrust-tokio

解决方案


推荐阅读