I understand Array cannot be converted to Tuple without specifing the type because Array size is runtime known.
But why is converting StaticArray to Tuple not supported?
Tuple.from(StaticArray[1, 2])
expected argument #1 to 'Tuple(*T).from' to be Array(T), not StaticArray(Int32, 2)
Overloads are:
- Tuple(*T).from(array : Array)
May I ask what’s the use case? I can’t imagine why you would need this.
You can do something like StaticArray[1, 2].unsafe_as(Tuple(Int32, Int32)) because the memory representation is the same.
1 Like
I suspect it wasn’t a conscious choice not to support it, but I bet it’s just that nobody has had a need for it. Most things in the stdlib exist because someone needed it, but StaticArray is pretty rare. I’ve only ever really seen it used as a micro-optimization, such as the buffer for a Slice to avoid allocating on the heap inside a completely encapsulated operation where the StaticArray and the Slice never leave the method. It seems either you have a very uncommon use case or a different solution may be more appropriate for what you’re trying to accomplish.
That said, if you really need this, you can make it work pretty simply with this patch:
struct StaticArray
def to_tuple
{% begin %}
{
{% for index in 0...N %}
self[{{index}}],
{% end %}
}
{% end %}
end
end
3 Likes
Just curious, why is StaticArray rarely used? Is fixed size array not very useful in crystal?
For most things, a Slice fills that role. StaticArray doesn’t incur GC cost, but Slice has a few benefits over the StaticArray:
- It doesn’t require the size to be known at compile time because the size is part of the type
- Mutating a
StaticArray can cause subtle bugs because the buffer is allocated on the stack, whereas Slice’s buffer is typically a reference to heap-allocated memory
My question was not insinuating that StaticArray is rarely used. I was asking about the conversion from StaticArray to Tuple for which I cannot think of many use cases.
I was reading about Splats and tuples and I thought it would be cool to splat StaticArray. But splat was only for the tuple type. (I’m learning the language and I really like it
)
I just wanted to know if this is possible:
def some_fn(a, b, c) end
some_fn *StaticArray[1, 2, 3].to_tuple
and now I know it is possible thanks to @straight-shoota and @jgaskins