Rust 将所有权移动到std::io::链

Rust 将所有权移动到std::io::链,rust,lifetime,ownership,Rust,Lifetime,Ownership,我有一个Reader,我想在它前面加上一些字节,创建一个链。理想情况下,我希望这样做: 使用std::io::{Chain,Read}; fn变薄(r:r)->链{ 设mut arr=[1u8,2u8,3u8]; //在此修改arr 返回arr.chain(r); } 但这会引发一个编译器错误: 错误[E0308]:类型不匹配 -->测试时间:7:12 | 3 | fn变薄(r:r)->链 |--------------由于返回类型,应为'std::io::Chain' ... 7 |返回ar

我有一个
Read
er,我想在它前面加上一些字节,创建一个
。理想情况下,我希望这样做:

使用std::io::{Chain,Read};
fn变薄(r:r)->链{
设mut arr=[1u8,2u8,3u8];
//在此修改arr
返回arr.chain(r);
}
但这会引发一个编译器错误:

错误[E0308]:类型不匹配
-->测试时间:7:12
|
3 | fn变薄(r:r)->链
|--------------由于返回类型,应为'std::io::Chain'
...
7 |返回arr.chain(r);
|^^^^^^^^^^^应为3个元素的数组,已找到&[u8]
|
=注意:应为'std::io::Chain'类型`
找到类型“std::io::Chain”`
据我所知,这似乎是因为
Read
是为片而不是数组实现的,不知何故,我的数组在这里衰减为片。
但是,当我将返回类型中的数组更改为一个切片并给它一个显式的生存期时,如下所示:

使用std::io::{Chain,Read};
fn thingify{
设arr=[1u8,2u8,3u8];
//在此修改arr
返回arr.chain(r);
}
我只是得到了另一个编译器错误:

错误[E0515]:无法返回引用局部变量'arr'的值`
-->测试。rs:19:12
|
19 |返回arr.chain(r);
|            ---^^^^^^^^^
|            |
|返回引用当前函数拥有的数据的值
|“啊”是在这里借来的

如何将数组的所有权转移到
,以便返回它?对于
[u8]
,这是不可行的吗?

因为
读取
是为而不是为
[u8;3]
实现的,编译器会自动将数组转换为引用片。这意味着只要切片有效,数组就必须有效,只要链有效

有几种解决方案,你可以向调用者请求一个可变的切片,如果你想使它变异,你可以使它成为
静态的
,如果你不想,你可以使它成为
常量
,如果你需要调整它的大小,你需要一个
向量
,等等

使用std::io:{stdin,Chain,Read};
fn a(arr:&mut[u8;3],r:r)->链{
arr.copy_from_slice(&[1,2,3]);
arr.chain(右)
}

fn b(r:r)->chain您的第一个想法是正确的,但最终它将不起作用,除非
arr
具有静态生存期,如果它是函数的常量值,您可以像这样使用它(),否则这是不可能的,因为
arr
将在函数作用域的末尾被删除,对
arr
的任何引用都将是一个悬空指针。我最终创建了自己的结构,包含了一个
,并手动实现了
读取
。非常感谢。:)