I've been working on a platformer game in rust. Game objects are stored in a Vec, and each is updated independently. However, a given object would like to interact with other objects. In C I would do something like fn update(&mut self, others: &mut [Self]). However, this would result in the parameters being aliased, which is not allowed.

What I'm looking for is some type that acts like a &mut [T], but remembers which element it is not allowed to access. I could use two &mut [T] values, built with split_at_mut, but this is unwieldy. I could make a struct that contains both. Is there a crate that does this? Ideally it would use unsafe internally so the compiler knows there is exactly one element in between. (that is to say, I would prefer something using only 24 bytes)

Chain does not do what I want because it can only be used as an iterator, not for indexing. To be clear, I would like to be able to index the result exactly like a &mut [T], except that it will find the element under consideration to be out of range.

you are viewing a single comment's thread
view the rest of the comments
[–] 3 points 3 days ago (1 child)

I don't think you need a mutex for this situation.

  • source
  • parent
  • hideshow 2 child comments
  • [–] 2 points 2 days ago* (1 child)

    I think you're right since a given object interacting with something else is commutative. As long as you iterate through all entities with a given set of components (all mobs against all collision borders) I'm pretty sure it doesn't matter what order you calculate them in even as long as you resolve it all by the next tick in the game world state. You're also only reading values from many places and updating one value with the variable that owns it and can mutate it.

  • source
  • parent
  • hideshow 2 child comments