为何Rust 2015版可编译的trait定义在2018版无法编译?
问题原因及修复方案
这个问题的核心是Rust 2018版本对函数参数语法做了严格限制,而你的代码刚好使用了2015允许但2018已经废弃的写法。
具体来说,在你的trait定义里:
trait Command<T> { fn execute(&self, &mut T); }
第二个参数只写了类型&mut T,却没有指定参数名。在Rust 2015中,这种省略参数名的写法是允许的(虽然会弹出未使用变量的警告),但从2018版本开始,编译器要求所有函数参数必须明确指定参数名(或者用_作为匿名占位符),所以会抛出你看到的语法错误:expected one of : or @, found )。
两种修复方式:
方式一:给参数添加有意义的名称(推荐,代码可读性更高)
trait Command<T> { fn execute(&self, target: &mut T); }这样不仅符合2018的语法规范,也能清晰表达参数的用途,后续实现这个trait时也能正常使用该参数。
方式二:用
_作为匿名参数名(适用于不需要使用该参数的场景)trait Command<T> { fn execute(&self, _: &mut T); }这种写法会告诉编译器你明确知道这个参数的存在,但暂时不需要使用它,既不会触发语法错误,也不会弹出未使用变量的警告。
修改后再用rustc --edition=2018 main.rs编译,就能正常通过了,同时也兼容2015版本的编译环境。
内容的提问来源于stack exchange,提问作者T.Shin
相关产品推荐
相关产品推荐

