我遇到了一个问题,并将其简化为以下代码:
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::new为DefaultLogger以下对象创建方法的专业化:
impl A<DefaultLogger> {
fn new() -> Self {
let logger = DefaultLogger;
A {
logger: Box::new(logger),
}
}
}
Run Code Online (Sandbox Code Playgroud)