为什么我的特征定义与 2015 版兼容,但与 2018 版不兼容?

Why does my trait definition compile with the 2015 edition but not with the 2018 edition?

我写了这个简单的程序:

trait Command<T> {                                                                                                      
    fn execute(&self, &mut T);                                                                                          
}                                                                                                                       

fn main() {                                                                                                             
    let x = 0;                                                                                                          
}    

我用 rustc --edition=2018 main.rs 编译了这个并得到了错误信息:

error: expected one of `:` or `@`, found `)`
 --> main.rs:2:29
  |
2 |     fn execute(&self, &mut T);
  |                             ^ expected one of `:` or `@` here

通过 rustc --edition=2015 main.rsrustc main.rs 编译不会导致此错误,尽管有一些警告。

这段代码有什么问题?

匿名特征参数已在 2018 版中删除:No more anonymous trait parameters

如果要忽略参数,在&mut T前加上_:

trait Command<T> {
    fn execute(&self, _: &mut T);
}

使用 rustc main.rs 编译有效,因为它默认为 --edition=2015


事实上,如果你把你的 main.rs 放在一个新的 Cargo 项目中,然后从 Cargo.toml 中删除 edition = "2018",然后 运行

cargo fix --edition

然后 Cargo 将自动添加缺少的 _:。参见 Transitioning an existing project to a new edition