Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to control the size of an array using the type parameter of a generic?

Tags:

rust

What follows is just used as an example, and not valid Rust code.

struct Vec<T: Sized, Count> {     a: [T; Count] } 

Something like it is possible in C++ templates, but I haven't seen it in Rust.

like image 675
Byron Avatar asked Jan 25 '15 13:01

Byron


People also ask

Can you use generics with an array?

To understand the reason, you first need to know two arrays are covariant and generics are invariant. Because of this fundamental reason, arrays and generics do not fit well with each other.

Why is generic array creation not allowed in Java?

Quote: Arrays of generic types are not allowed because they're not sound. The problem is due to the interaction of Java arrays, which are not statically sound but are dynamically checked, with generics, which are statically sound and not dynamically checked.

How do you create an array of generic objects in Java?

Use the Reflection Class to Create Generic Arrays in Java In this type of approach, a reflection class is used to create a generic array whose type will be known at the runtime only. The only difference between the previous approach and this approach is that the reflection class is used as the constructor itself.

Which one of the following options is the correct name for empty type parameter?

It is called generics.


1 Answers

Rust 1.51

Use const generics:

struct Vec<T: Sized, const COUNT: usize> {     a: [T; COUNT], } 

Previous versions

RFC 2000 — const generics introduces support for this and progress is tracked in issue #44580.

If you look at the design of Rust, you will notice that it started first by tackling the hardest problems (memory-safe, data-race free) but there are otherwise lots of areas where it is "incomplete" (compared to what could be achieved).

In particular, generic structures and functions started out somewhat limited:

  • lack of Higher Kinded Types (HKT)
  • lack of non-type parameters => arrays are special-cased, and implementing a trait for an array is a known issue, the work-around being to implement it for a few different dimensions
  • lack of variadic parameters => tuples are special-cased, and implementing a trait for all tuples is similarly difficult

For the moment, not all of these are implemented, not because they are not desired but simply because time was lacking. The idea of Rust 1.0 was not to release a final product that would not evolve, but a stable base from which to start; some or maybe all will come.

like image 151
Matthieu M. Avatar answered Sep 23 '22 05:09

Matthieu M.