尝试从标准输入读取JSON时出现借入错误

时间:2019-05-08 21:40:27

标签: json rust borrow-checker

我正在尝试使用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]

很显然,我在这里借用不正确,但是我不确定如何解决这个问题。

2 个答案:

答案 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