Rust &引用;借来的价值活得不够长。”;使用as_slice()时

Rust &引用;借来的价值活得不够长。”;使用as_slice()时,rust,borrow-checker,Rust,Borrow Checker,我遇到了一个错误: extern crate rustc_serialize; // 0.3.24 use rustc_serialize::base64::{self, FromBase64, ToBase64}; fn main() { let a: [u8; 30] = [0; 30]; let b = a.from_base64().unwrap().as_slice(); println!("{:?}", b); } 错误: error[E0597]:借入

我遇到了一个错误:

extern crate rustc_serialize; // 0.3.24

use rustc_serialize::base64::{self, FromBase64, ToBase64};

fn main() {
    let a: [u8; 30] = [0; 30];
    let b = a.from_base64().unwrap().as_slice();
    println!("{:?}", b);
}
错误:

error[E0597]:借入值的有效期不够长
-->src/main.rs:7:13
|
7 |让b=a.从_base64().展开().作为_slice();
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|             |
|临时值的寿命不够长
8 | println!(“{:?}”,b);
9 | }
|-临时价值需要持续到此处
|
=注意:考虑使用“让”绑定来增加其生命周期。

但对我来说,代码不会出错。为什么我会有这个错误?

这里的问题是,您没有将来自\u base64的
结果存储在任何地方,然后通过调用
作为\u slice
来引用它。这样的链接调用会导致来自_base64的
的结果超出行末尾的范围,并且引用不再有效

extern crate rustc_serialize; // 0.3.24

use rustc_serialize::base64::FromBase64;

fn main() {
    let a: [u8; 30] = [0; 30];
    let b = a.from_base64().unwrap();
    println!("{:?}", b.as_slice());
}

请注意,
让a:[u8,…30]=[123,34,…]可能会很繁重,因为每当更改阵列时,都必须调整长度。如果您希望记录长度,这很好,但是如果您不需要它并且感觉到痛苦,那么有另一种方式来表达这一点:
let a=[123u8,34,…]。关键是
123
34
只是泛型积分(没有特定类型),因此您可以通过指定
u8
来约束它们;但是,由于数组是同质容器,另一种解决方案是约束一个数组的类型(第一个,通常是
123u8
),编译器推断所有数组都是
u8
这里的问题是,您没有将from_base64的结果存储在任何位置,然后通过调用as_slice引用is
-为什么?我可以在几乎任何其他编程语言中做到这一点,它会工作的。这就是目前的情况,它会解决这个问题。因此,即使a.from_base64()不会更改
a
,并生成一个新变量,但它现在不会生锈?它与
a
没有连接,事实上,您从_base64
引用了一个临时的
结果,因为它没有存储在任何地方。