当我遇到这个编译错误时,我正在尝试一个简单的函数。这背后的实际原因是什么?在我的情况下(下面的代码),在lifetime参数之前写入type参数无效。编译器不应该更清楚吗?
use std::fmt::Debug;
fn random_func<T : Debug, 'a>(parameter : &'a mut T) {
println!("{:?}", parameter);
}
fn main(){
let mut name : String = "random".to_string();
random_func(&mut name);
println!("{:?}", "compiled successfully");
}
错误:
life_time_trait.rs:3:27: 3:29 error: lifetime parameters must be declared prior to type parameters
life_time_trait.rs:3 fn random_func<T : Debug, 'a>(parameter : &'a mut T) {
^~
答案 0 :(得分:2)
我不确定这是 的原因,但请记住,类型参数可以有生命周期边界,但生命周期参数不能有类型边界。因此,将它们放在首位意味着您不需要处理非前向声明。
就个人而言,我认为这条规则使事情更容易理解,并且更容易实现。双赢!
答案 1 :(得分:2)
在设计语言时,或多或少会有任意决定。
例如,为什么在不需要实现相同功能时,在函数参数名称前面允许mut
?为什么要求let
在可以消除歧义时声明变量?
一般来说,它归结为方便:
回到上面的例子:
mut
是语法糖,避免函数内部let mut name = name;
let
保留语法LL(1),从而更容易开发替代解析器(用于文本编辑器或IDE中作为示例)在这个确切的情况下,我不知道确切的原因,但除此之外。有无数这样或多或少的任意设计决策(特别是在语法上),这样的自行车脱落几乎没有价值。
有人可能会争辩说 writer 会稍微容易一些,而另一个人会回复说,容纳读者更重要并试图证明当前的形式更具可读性...这种争论通常是无止境的,每一方都拒绝让步。
我个人欢迎这样的编译器限制(并希望rustfmt
),这对于琐事的争论不那么重要。