为什么我的特征定义与 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.rs
或 rustc 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。
我写了这个简单的程序:
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.rs
或 rustc 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。