gpt4 book ai didi

types - 为什么编译器需要特征的实现才能调用默认的自由函数?

转载 作者:行者123 更新时间:2023-12-03 11:38:47 25 4
gpt4 key购买 nike

在不采用self的特征上调用默认实现时,为什么需要对实现类型进行注释?
以下是minimal, reproducible example(playground):

mod builder {
pub trait Builder: Sized {
fn new() -> Simple {
Simple
}
}

pub struct Simple;

impl Builder for Simple {}
}

pub fn main() {
let _ = builder::Builder::new();

/* Working version */
// use builder::Builder;
// let _ = builder::Simple::new();
}
这使:
error[E0283]: type annotations needed
--> src/main.rs:14:13
|
3 | fn new() -> Simple {
| ------------------ required by `builder::Builder::new`
...
14 | let _ = builder::Builder::new();
| ^^^^^^^^^^^^^^^^^^^^^ cannot infer type
|
= note: cannot satisfy `_: builder::Builder`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0283`.
error: could not compile `playground`.

To learn more, run the command again with --verbose.
E0283的编译器说明未提及默认实现,我同意这是有意义的。但是对于默认实现,为什么需要类型?

最佳答案

Rust中提供的方法与Java中的static方法不同。即使是没有参数的函数和默认实现,实现者也可以覆盖它们。考虑添加另一种实现Builder但覆盖new函数的类型:

struct Noisy {}

impl builder::Builder for Noisy {
fn new() -> builder::Simple {
println!("Ahahahah I'm creating a Simple!!!11!");
builder::Simple
}
}

fn main() {
// wait, should this call builder::Simple::new() or Noisy::new()?
let _ = builder::Builder::new();
}
如果您希望始终具有相同行为的Java static函数的效果,则应使用一个自由函数,正如 prog-fh's answer所建议的那样。

关于types - 为什么编译器需要特征的实现才能调用默认的自由函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64441082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com