如何强制将值从内部范围移动到外部范围而不是借用?
How can I force a value to be moved from an inner scope to an outer instead of borrowing?
我是 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();
}
我无法将 &[u8]
从 deflate_deref
移动到 piece
。我试过 Vec<u8>
和 Box<&[u8]>
。我有一个错误"deflate_unwrapped does not live long enough"...我无法按[u8]
类型进行操作,因为它在编译类型中没有确切的大小,而引用我只能借用...
在这种情况下,我必须使用特定的东西还是重写这段代码?
游乐场linkhttp://is.gd/u8wfm7
让我们将您的代码简化为一个真正最小的示例:
fn main() {
let a = {
let b = 42;
&b
};
}
因为这就是您的案例归结为:尝试获取对某物的引用并在原始对象超出范围后存储该引用。
主要有两种处理方法:
更改您引用的变量的范围:
fn main() {
let b;
let a = {
b = 42;
&b
};
}
只要您不处理跨越函数边界(即,返回对函数内部某些内容的引用)或某些具有循环边界的组合,这通常是最佳解决方案。
不要引用,而是在当时做你想做的处理:
fn main() {
let a = {
let b = 42;
b.clone()
};
}
在您的特定情况下,可以将 &[u8]
变成 Vec<u8>
,可以写成 Vec::from(slice)
。当然,在您的具体示例中,您仍然需要像第一种方式那样担心将向量存储在某处,或者对整个事物使用 Cow<[u8]>
。
我写了一篇文章,其中考虑了这些您可能会觉得有用的问题:http://chrismorgan.info/blog/rust-fizzbuzz.html。它处理 String
和 str
,而您更多地处理 Vec<u8>
/Bytes
和 [u8]
,但概念非常相同。
我是 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();
}
我无法将 &[u8]
从 deflate_deref
移动到 piece
。我试过 Vec<u8>
和 Box<&[u8]>
。我有一个错误"deflate_unwrapped does not live long enough"...我无法按[u8]
类型进行操作,因为它在编译类型中没有确切的大小,而引用我只能借用...
在这种情况下,我必须使用特定的东西还是重写这段代码?
游乐场linkhttp://is.gd/u8wfm7
让我们将您的代码简化为一个真正最小的示例:
fn main() {
let a = {
let b = 42;
&b
};
}
因为这就是您的案例归结为:尝试获取对某物的引用并在原始对象超出范围后存储该引用。
主要有两种处理方法:
更改您引用的变量的范围:
fn main() { let b; let a = { b = 42; &b }; }
只要您不处理跨越函数边界(即,返回对函数内部某些内容的引用)或某些具有循环边界的组合,这通常是最佳解决方案。
不要引用,而是在当时做你想做的处理:
fn main() { let a = { let b = 42; b.clone() }; }
在您的特定情况下,可以将
&[u8]
变成Vec<u8>
,可以写成Vec::from(slice)
。当然,在您的具体示例中,您仍然需要像第一种方式那样担心将向量存储在某处,或者对整个事物使用Cow<[u8]>
。
我写了一篇文章,其中考虑了这些您可能会觉得有用的问题:http://chrismorgan.info/blog/rust-fizzbuzz.html。它处理 String
和 str
,而您更多地处理 Vec<u8>
/Bytes
和 [u8]
,但概念非常相同。