我是Rust的新手.如何强制将值从内部范围移动到外部而不是借用?
let mut r_buf = BufReader::new(file.unwrap());
let mut eof = false;
while !eof {
let piece = r_buf.fill_buf();
if piece.is_ok() {
let mut piece = piece.unwrap();
let piece_len = piece.len();
if opt.compress {
let deflated = deflate_bytes(piece);
if deflated.is_none() {
panic!(format!("Cant deflate file {}", path.to_str().unwrap_or("")));
}
let deflate_unwrapped = deflated.unwrap();
let deflate_deref = deflate_unwrapped.deref();
piece = deflate_deref;
}
/* bf: &mut BufStream<File>*/
let w = bf.write(piece);
if w.is_ok() {
written_bytes = w.unwrap();
}
Run Code Online (Sandbox Code Playgroud)
我不能移动&[u8]从deflate_deref到piece.我试过Vec<u8>和Box<&[u8]>.我有一个错误"deflate_unwrapped活得不够长"...我不能按[u8]类型操作,因为它在编译类型中没有确切的大小,而引用我只能借用...
在这种情况下,我必须使用特定的东西或重写此代码吗?
游乐场链接http://is.gd/u8wfm7
让我们将您的代码减少到一个真正最小的例子:
fn main() {
let a = {
let b = 42;
&b
};
}
Run Code Online (Sandbox Code Playgroud)
因为这就是你的情况所追求的:尝试在原始对象超出范围之后对某些东西进行引用并存储该引用.
有两种主要方法可以解决这个问题:
更改要引用的变量的范围:
fn main() {
let b;
let a = {
b = 42;
&b
};
}
Run Code Online (Sandbox Code Playgroud)
只要您不处理跨越函数边界(即,返回对函数内部内容的引用)或某些与循环边界的组合,这通常是最佳解决方案.
不要参考,而是在那时做你想做的处理:
fn main() {
let a = {
let b = 42;
b.clone()
};
}
Run Code Online (Sandbox Code Playgroud)
在你的特殊情况下,这可能会&[u8]变成一个Vec<u8>可写的Vec::from(slice).当然,在您的具体示例中,您仍然需要担心以第一种方式将向量存储在某处,或者使用Cow<[u8]>整个事物.
我写了一篇文章,其中包括您可能会发现有用的问题:http://chrismorgan.info/blog/rust-fizzbuzz.html.它处理String和str处理更多的Vec<u8>/ Bytes和[u8],但概念非常相似.