我正在爲Rust應用程序編寫Rust庫,並試圖從Java代碼向Rust代碼發送數據。這些數據由我在Rust端構建的稱爲Chunk
的結構組成。我還發送數據來修改這些結構,所以它們需要變化。我收到一個錯誤,說HashSet
內的Chunk
是不可改變的,不應該如此。迭代時無法分配到不可變的索引內容
#[derive(Eq, PartialEq, Hash)]
struct Chunk {
x: i32,
y: i32,
z: i32,
blocks: [[[i32; 16]; 16]; 16],
}
lazy_static! {
// static mutable list (or at least it should be)
static ref CHUNKS: Mutex<HashSet<Chunk>> = Mutex::new(HashSet::new());
}
#[no_mangle]
pub extern fn add_chunk(cx: i32, cy: i32, cz: i32, c_blocks: [[[i32; 16]; 16]; 16]) {
// create Chunk and put it in the global list
CHUNKS.lock().unwrap().insert(Chunk {x: cx, y: cy, z: cz, blocks: c_blocks});
}
#[no_mangle]
pub extern fn update_block(x: i32, y: i32, z: i32, id: i32) {
let cx: i32 = x/16;
let cy: i32 = y/16;
let cz: i32 = z/16;
let rx: i32 = if x > 0 { x % 16 } else { 16 + (x % 16) };
let ry: i32 = if y > 0 { y % 16 } else { 16 + (y % 16) };
let rz: i32 = if z > 0 { z % 16 } else { 16 + (z % 16) };
for c in CHUNKS.lock().unwrap().iter() {
if c.x == cx && c.y == cy && c.z == cz {
// ERROR: cannot assign to immutable indexed content `c.blocks[..][..][..]`
c.blocks[rx as usize][ry as usize][rz as usize] = id;
}
}
}
我不知道我是否應該使用一個Vec
或HashSet
,我的是後者,因爲它似乎最容易的。
爲什麼不使用'(x,y,z)'來映射塊? – starblue