无法使用本地创建的矢量,因为“借用了”

时间:2019-09-03 07:28:59

标签: json vector rust serde borrowing

由于错误,我无法获得向量的第一个元素,也无法更改结构设计。我尝试借阅,但struct期望使用ExtrudeGeometry。

android.widget.TextView
#[wasm_bindgen]
pub fn toCollection(arr: js_sys::Array, r_type: String) -> JsValue {
    let n_arr: Vec<ExtrudeGeometry> = arr.into_serde().unwrap();
    if r_type == "GeometryCollection" {
        return JsValue::from_serde(&OutputGeometryCollection {
            collection: n_arr,
            r#type: r_type,
        })
        .unwrap();
    } else {
        let ex: ExtrudeGeometry = n_arr[0];
        return JsValue::from_serde(&OutputObject {
            data: ex,
            r#type: r_type,
        })
        .unwrap();
    }
}

1 个答案:

答案 0 :(得分:2)

在这个答案中,我假设Rust的所有权系统是已知的。您的向量拥有这些项目,因此,如果您要求第一个,则只能借用它,因为向量是由内存中连续的项目组成的。您不能从索引符号中随机删除一个项目。

如果您想选第一个,则有3种选择:

  • 您不必关心向量的其余部分:您可以将其转换为迭代器,并进行迭代的第一项:

    vector
        .into_iter() // consume the vector to get an iterator
        .next() // get the first iterated item
        .unwrap()
    
  • 您关心其余的,但不关心订购,请使用swap_remove

    vector.swap_remove(0)
    
  • 您关心剩余和排序:不要使用向量。我没有选择,可以使用remove,但这是一个O(n)函数。


顺便说一句,返回最后一位并不是惯用的:

#[wasm_bindgen]
pub fn toCollection(arr: js_sys::Array, r_type: String) -> JsValue {
    let n_arr: Vec<ExtrudeGeometry> = arr.into_serde().unwrap();

    if r_type == "GeometryCollection" {
        JsValue::from_serde(&OutputGeometryCollection {
            collection: n_arr,
            r#type: r_type,
        })
        .unwrap()
    } else {
        let ex = n_arr.into_iter().next().unwrap();

        JsValue::from_serde(&OutputObject {
            data: ex,
            r#type: r_type,
        })
        .unwrap();
    }
}