๐Ÿ˜ดGenerics

How to declare generic parameters

Generic parameters have the same syntax for classes/struct/interfaces and functions.

class MyOwnInsanelyFastList<T> {...}
func important_function<T>() {...}

The overall syntax is

[name]<[...[<generic name>: [where clause] [ = <default type>]]]>

Neither classes/functions/etc... are type-checked if they contain generics

note: fn hello<>() {...} counts as a generic function

Where clause

The where clause is used as a way to make sure the correct generic has been passed. For example, let's imagine you are making a vector class that only what's T to be a Sized type. (all types implement Sized except those whose size is not known at compile time, for example, void)

class MyVector<T: Sized> {...}

Here, snowball checks if the given generics implements the given types.

let a: MyVector<void> // error: void doesn't implement "Sized"
let b: MyVector<i32> // ok

You can declare where clauses separately to either check for other types or better reading:

class Vector<T: Sized> {
   func to_string<>() 
      where T: ToString
   { ... } 
}

Last updated