servo / rust-smallvec

"Small vector" optimization for Rust: store up to a small number of items on the stack
Apache License 2.0
1.32k stars 141 forks source link

Wishlist: `TryFrom<SmallVec<A>> for [T; N]` #357

Open ZhennanWu opened 3 months ago

ZhennanWu commented 3 months ago

This is an equivalent API of TryFrom<Vec<T>> for [T; N] which was stabilized in Rust 1.48.

Reason:

When using the smallvec crate in a message-passing context, I often find I using it as a container for payloads with pre-determined length.

fn send(&self) -> SmallVec<[i32; 2]> {
    smallvec![1, 2, 3]
}

fn recv(&mut self, msg: SmallVec<[Box<dyn Any>; 2]>) {
    let [a, b, c] = some_unwrap_magic!(msg);
    // ...
}

Now the only way to do this seems to be calling next().unwrap() on msg.into_iter(). But Vec provides a very nice way of doing this, and presumably more friendly to compiler optimizations:

let [a, b, c]: [Box<dyn Any>; 3] = msg.try_into().unwrap();

I wish this feature to make its way into ver 2.0