为什么要在类型参数之前声明生命周期参数?

时间:2015-08-19 16:18:20

标签: rust lifetime

当我遇到这个编译错误时,我正在尝试一个简单的函数。这背后的实际原因是什么?在我的情况下(下面的代码),在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) {

                                           ^~

2 个答案:

答案 0 :(得分:2)

我不确定这是 的原因,但请记住,类型参数可以有生命周期边界,但生命周期参数不能有类型边界。因此,将它们放在首位意味着您不需要处理非前向声明。

就个人而言,我认为这条规则使事情更容易理解,并且更容易实现。双赢!

答案 1 :(得分:2)

在设计语言时,或多或少会有任意决定。

例如,为什么在不需要实现相同功能时,在函数参数名称前面允许mut?为什么要求let在可以消除歧义时声明变量?

一般来说,它归结为方便:

  • 或者用户,又名糖
  • 或实施者

回到上面的例子:

  • mut是语法糖,避免函数内部let mut name = name;
  • let保留语法LL(1),从而更容易开发替代解析器(用于文本编辑器或IDE中作为示例)

在这个确切的情况下,我不知道确切的原因,但除此之外。有无数这样或多或少的任意设计决策(特别是在语法上),这样的自行车脱落几乎没有价值。

有人可能会争辩说 writer 会稍微容易一些,而另一个人会回复说,容纳读者更重要并试图证明当前的形式更具可读性...这种争论通常是无止境的,每一方都拒绝让步。

我个人欢迎这样的编译器限制(并希望rustfmt),这对于琐事的争论不那么重要。