rust 当它明显受到约束时,命中“一般不受约束错误”

x759pob2  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(125)

Here is a link to a playground
这是代码(为了可读性而剥离):

#[async_trait]
impl <'a, FUNC, CONTEXT, PARAM, RETURN, FUT> StepWithParams<CONTEXT, PARAM, RETURN> for FUNC 
where 
    FUNC: FnOnce(&'a PARAM) -> FUT + Send + Sync, 
    FUT: Future<Output = Result<RETURN, ErrTypes>> + Send + Sync,
    PARAM: Send + Sync,
    CONTEXT: Send + Sync,
    RETURN: Send + Sync,
{

    async fn run_user_step (self, request_context: &'a CONTEXT) -> Result<RETURN, ErrTypes> {
        let param = PARAM::from_context(request_context);
        self(param).await
    }
}

字符串
完整版本链接在操场上。编译此将生成编译器错误,如下所示:

error[E0207]: the type parameter `FUT` is not constrained by the impl trait, self type, or predicates
  --> src/main.rs:22:41
   |
22 | impl <'a, FUNC, CONTEXT, PARAM, RETURN, FUT> StepWithParams<CONTEXT, PARAM, RETURN> for FUNC 
   |                                         ^^^ unconstrained type parameter

For more information about this error, try `rustc --explain E0207`.


但是,泛型参数不是明显受到约束吗?

klh5stk1

klh5stk11#

从参考:
如果泛型参数在以下之一中至少出现一次,则该参数约束实现:

  • 已实现的trait(如果有的话)
  • 执行类型
  • 作为包含约束实现的另一个参数的类型的边界中的关联类型

因为你写的是一个blanket implementation,所以后面两个项目符号是不相关的(除非你给Festival添加额外的trait bounds)。所以你需要给trait定义添加FUT,这意味着impl块开始:

impl <'a, FUNC, CONTEXT, PARAM, RETURN, FUT> StepWithParams<CONTEXT, PARAM, RETURN, FUT> for FUNC

字符串
在编译器的指导下进行了一些其他的整理,最终得到了这个playground
错误详细信息链接到的error code detailsoriginal RFC也提供了给予更多的背景信息。

相关问题