预期的类型参数,找到结构

Mar*_*ink 7 traits rust

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

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();
}
Run Code Online (Sandbox Code Playgroud)

产生以下错误:

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();
}
Run Code Online (Sandbox Code Playgroud)

当我A在正常功能(如main)中构造trait 时,我希望它能正常工作。例:

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),
        };
}
Run Code Online (Sandbox Code Playgroud)

Hau*_*eth 10

问题在这里:

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

        A {
            logger: Box::new(logger),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

你想回来,A<L>但你回到A<DefaultLogger>了你不能确定的地方L == DefaultLogger

要解决此问题,您可以提供专门A::newDefaultLogger以下对象创建方法的专业化:

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

        A {
            logger: Box::new(logger),
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案节省了我大量的调试时间,并极大地增强了我对 Rust 中泛型如何工作的理解。我知道 SO 上不允许发表“谢谢”评论,但无论如何还是谢谢你。 (6认同)