|
|
|
@ -218,7 +218,7 @@ error[E0597]: `string2` does not live long enough
|
|
|
|
|
|
|
|
|
|
在`longest`函数中,`string2`的生命周期也是`'a`,由此说明`string2`也必须活到`println!`处, 可是`string2`在代码中实际上只能活到内部语句块的花括号处`}`,小于它应该具备的生命周期`'a`,因此编译出错。
|
|
|
|
|
|
|
|
|
|
作为人类,我们可以很清晰的看出`result`实际上引用了`string1`,因为`string1`的长度明显要比`string2`长,既然如此,编译器不该如此矫情才对,它应该能认识到`resuilt`没有引用`string2`,让我们这段代码通过。只能说,作为尊贵的人类,编译器的发明者,你高估了这个工具的能力,它真的做不到!而且Rust编译器在调教上是非常保守的:当可能出错也可能不出错时,它会选择前者,抛出编译错误。
|
|
|
|
|
作为人类,我们可以很清晰的看出`result`实际上引用了`string1`,因为`string1`的长度明显要比`string2`长,既然如此,编译器不该如此矫情才对,它应该能认识到`result`没有引用`string2`,让我们这段代码通过。只能说,作为尊贵的人类,编译器的发明者,你高估了这个工具的能力,它真的做不到!而且Rust编译器在调教上是非常保守的:当可能出错也可能不出错时,它会选择前者,抛出编译错误。
|
|
|
|
|
|
|
|
|
|
总之,显式的使用生命周期,可以让编译器正确的认识到多个引用之间的关系,最终帮我们提前规避可能存在的代码风险。
|
|
|
|
|
|
|
|
|
@ -583,4 +583,4 @@ where
|
|
|
|
|
|
|
|
|
|
从本章开始,最大的收获就是可以在结构体中使用引用类型了,说实话,为了引入这个特性,我已经憋了足足30章节。。
|
|
|
|
|
|
|
|
|
|
但是,还没完,是的,就算是将近2万字,生命周期的旅程依然没有完结,下一节将介绍一些关于生命周期的高级特性,这些特性你在其它中文书中目前还看不到的。
|
|
|
|
|
但是,还没完,是的,就算是将近2万字,生命周期的旅程依然没有完结,下一节将介绍一些关于生命周期的高级特性,这些特性你在其它中文书中目前还看不到的。
|
|
|
|
|