rust - 期望的类型参数,找到的结构

标签 rust traits

<分区>

我遇到了一个问题,我将其简化为以下代码:

trait Logger {}

struct DefaultLogger;

impl Logger for DefaultLogger {}

struct A<L> where L: Logger {
    logger: Box<L>,
}

impl<L> A<L> where L: Logger {
    fn new() -> Self {
        let logger = DefaultLogger;

        A {
            logger: Box::new(logger),
                          // ^^^^^^ Here is the problem
        }
    }
}

fn main() {
    let a = A::new();
}

产生以下错误:

error[E0308]: mismatched types
  --> src/main.rs:16:30
   |
16 |             logger: Box::new(logger),
   |                              ^^^^^^ expected type parameter, found struct `DefaultLogger`
   |
   = note: expected type `L`
              found type `DefaultLogger`

当我在普通函数(如 main)中构造特征 A 时,就像我期望的那样。示例:

trait Logger {}

struct DefaultLogger;

impl Logger for DefaultLogger {}

struct A<L> where L: Logger {
    logger: Box<L>,
}

fn main() {
        let logger = DefaultLogger;

        let _a = A {
            logger: Box::new(logger),
        };
}

最佳答案

问题出在这里:

impl<L> A<L> where L: Logger {
    fn new() -> Self {
        let logger = DefaultLogger;

        A {
            logger: Box::new(logger),
        }
    }
}

您想返回 A<L>但你返回A<DefaultLogger>你不能确定 L == DefaultLogger .

要解决这个问题,您可以提供将创建方法的特化 A::new仅适用于 DefaultLogger :

impl A<DefaultLogger> {
    fn new() -> Self {
        let logger = DefaultLogger;

        A {
            logger: Box::new(logger),
        }
    }
}

关于rust - 期望的类型参数,找到的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45253784/

相关文章:

oop - 为什么 Rust 不支持特征对象向上转换?

rust - 当您使用多个嵌套范围时会发生什么?

python - 在一个类中使用 HasTraits 和 PyQt 信号

generics - 将 Arc<RwLock<T>> 转换为 Arc<RwLock<TraitObject>

rust - 如何共享堆分配的特征对象?

rust - 如何在不移动自身的情况下消除混合 Iterator 和 Futures 调用链的歧义?

generics - 返回通用 Vec

rust - 枚举变体大小过大导致的性能问题的解决方案

rust - 使用 '?'运算符对自定义类型进行自动错误转换

php - 在 PHP 中使用特征