我正在学习Rust,并测试通过函数进行一些数组复制。我确信在Rust中有内置的函数可以复制/克隆数组信息,但我认为自己实现一个函数能帮助我更好地理解如何通过函数传递引用。
fn copy_str_arr_original (a1: [&str; 60], a2: &mut [&str; 60]) {
// copy 1 into 2
for i in 0..60 {
a2[i] = a1[i];
} // change is reflected in a2 as it is passed as &mut
}
然而,这个问题导致了针对
&str
类型的错误信息:these two types are declared with different lifetimes...
。在进一步研究后,我尝试声明自己的生命周期并将其分配给它们,问题得到了解决!fn copy_str_arr_fix<'a> (a1: [&'a str; 60], a2: &mut [&'a str; 60]) {
// copy 1 into 2
for i in 0..60 {
a2[i] = a1[i];
} // change is reflected in a2 as it is passed as &mut
}
为什么会这样呢?为什么数组中的值类型需要分配生命周期,而不是参数本身?换句话说,为什么这根本不起作用呢?
fn copy_str_arr_bad<'a> (a1: &'a [&str; 60], a2: &'a mut [&str; 60]) {
// does not work... ^-----------------------^-------- different lifetimes
for i in 0..60 {
a2[i] = a1[i];
}
}
我仍在努力掌握生命周期在更复杂的对象(例如数组和结构体)中的工作方式,因此任何解释都将不胜感激!
where 'b: 'a
,因为这意味着我们的目标超出了源的生命周期,这意味着我们的数组指向已释放的内存,对吗? - jtscopy_str_arr()
函数,但我未能想出一个例子。例如,如果您使源字符串静态并将目标字符串堆栈分配,则使用单个生命周期定义的copy_str_arr()
的调用仍会编译。大概编译器会自动找到较短的公共生命周期,并将其作为函数所需的寿命。 - user4815162342