我正在尝试使用pom库从stdin逐行解析JSON。
我已经窃取了首页上提供的json
实现(并且省略了下面的代码;这无关紧要),并且从以下代码中出现借用错误:
fn main() {
for line in io::stdin().lock().lines() {
let line2 = line.unwrap().as_bytes();
let _value = json().parse(line2).unwrap();
}
}
错误:
error[E0716]: temporary value dropped while borrowed
--> src/main.rs:73:23
|
73 | let tmpline = line.unwrap().as_bytes();
| ^^^^^^^^^^^^^------------ temporary value is freed at the end of this statement
| |
| creates a temporary which is freed while still in use
| argument requires that borrow lasts for `'static`
pom libray中的 .parse
具有类型:
pub fn parse(&self, input: &'a [I]) -> Result<O>
.as_bytes()
的类型:
pub fn as_bytes(&self) -> &[u8]
很显然,我在这里借用不正确,但是我不确定如何解决这个问题。
答案 0 :(得分:1)
这里的问题是,您正在使用一个寿命短于所需值的值的引用,该值位于以下行:line.unwrap().as_bytes()
。
as_bytes()
返回对u8
s的基础切片的引用。现在,由unwrap()
返回的基础切片恰好是一个临时语句,它将在语句末尾消失。
在Rust中,您可以在当前作用域中重新声明具有相同名称的变量,它们将覆盖先前定义的变量。要解决此问题,请将值存储在某个地方,然后对其进行引用。像这样:
fn main() {
for line in io::stdin().lock().lines() {
let line = line.unwrap();
let bytes = line.as_bytes();
let _value = json().parse(bytes).unwrap();
}
}
现在as_bytes()
返回的值可以指向与当前作用域一样长的对象。以前,您有以下方法:
fn main() {
for line in io::stdin().lock().lines() {
let line2 = line.unwrap().as_bytes(); // <-- the value returned by unwrap dies here
let _value = json().parse(line2).unwrap(); // <-- line2 would be dangling here
}
}
答案 1 :(得分:0)
line.unwrap()
返回一个String
,然后您可以使用as_bytes()
从中借用。由于您从不绑定String
本身,因此仅借用的字节片,String
在语句末尾被删除,借用的字节片无效。
使用String
将临时let s = line.unwrap()
绑定到变量,然后将s.as_bytes()
传递给json().parse
。