由于错误,我无法获得向量的第一个元素,也无法更改结构设计。我尝试借阅,但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();
}
}
答案 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();
}
}