Почему мое определение черты компилируется с выпуском 2015 года, но не с выпуском 2018 года?

Я написал эту простую программу:

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 не вызывает эту ошибку, хотя есть некоторые предупреждения.

В чем проблема с этим кодом?

1 ответ

Решение

Параметры анонимных черт были удалены в выпуске 2018 года: больше никаких анонимных параметров черт.

добавлять _: до &mut T если вы хотите игнорировать параметр:

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

Компилирование с rustc main.rs работает, потому что по умолчанию --edition=2015,


Действительно, если вы положите main.rs в новом проекте Cargo, затем удалите edition = "2018" от Cargo.tomlи запустить

cargo fix --edition

тогда Cargo добавит недостающие _: автоматически. См. Переход существующего проекта к новой редакции.

Другие вопросы по тегам