2015-03-31 38 views
0

我是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(); 
     } 

我无法从deflate_deref移动&[u8]piece。我试过Vec<u8>Box<&[u8]>。我有一个错误“deflate_unwrapped寿命不够长”...我无法操作[u8]类型,因为它没有编译类型的确切大小,而引用我只能借用...

In这种情况下,我必须使用特定的东西或重写此代码?

游乐场链接http://is.gd/u8wfm7

+0

欢迎来到Stack Overflow!由于我们无法编译您的代码以获得相同的错误,因此它将非常难以帮助您!请阅读有关创建[MCVE](http://stackoverflow.com/help/mcve)的信息。在这种情况下,它需要产生你所看到的同样的错误。理想情况下,你可以在[playpen](https://play.rust-lang.org/)上使用某些东西,但如果使用外部包装箱,这可能很困难。只要尽可能使问题成为**小**! – Shepmaster 2015-03-31 21:15:28

+0

感谢您的回复,请将链接添加到play.rust-lang.org。我认为这是更理论上的问题 – Vitaliy 2015-03-31 21:38:13

+0

'foo.deref()'通常写得更好'&* foo'。你也经常不需要'&*',例如方法调用做autoderef和autoref。 – 2015-04-01 00:58:31

回答

6

让你的代码减少到一个真正的小例子:

fn main() { 
    let a = { 
     let b = 42; 
     &b 
    }; 
} 

因为这才是你的情况是熬煮至:试图采取一些参考,并存储该参考原始对象超出范围之后。

有处理这个问题主要有两种方式:

  1. 变化,你正在服用一个参考变量的范围:

    fn main() { 
        let b; 
        let a = { 
         b = 42; 
         &b 
        }; 
    } 
    

    只要你不处理交叉函数边界(即返回函数内部的某个引用)或某些与循环边界的组合,这通常是最好的解决方案。

  2. 别拿参考,而是你希望在时间与它做什么样的处理:

    fn main() { 
        let a = { 
         let b = 42; 
         b.clone() 
        }; 
    } 
    

    在您的特定情况下,可以转动&[u8]Vec<u8>,这可以写成Vec::from(slice)。当然,在你的具体例子中,你仍然需要担心在第一种方式中存储矢量,或者使用Cow<[u8]>作为整个事情。

有我写这尤其考虑这些问题,你可能会发现有用的文章:http://chrismorgan.info/blog/rust-fizzbuzz.html。它涉及Stringstr,你在这里处理更多Vec<u8>/Bytes[u8],但概念非常相似。

+0

谢谢。你的文章是非常有用的。 – Vitaliy 2015-04-01 10:05:46

相关问题