Raku Types
raku(1) has three essential data types, and they each feature a runtime type system.
Contents
Scalars
A scalar is a single value. Scalars are named and referenced with a leading dollar sign ($).
my $a = 1;
Scalars can be any of strings (Str), integers (Int), booleans (Bool), or rational numbers (Rat).
Scalars can declared null, in which case they are typed as Any. If they are declared with any value, or if they are annotated with any type, they have the corresponding type.
my Int $a; say $a.WHAT; # (Int) my $b; say $b.WHAT; # (Any) $b= 1; say $b.WHAT; # (Int) $b= "1"; say $b.WHAT; # (Str) $b= Nil; say $b.WHAT; # (Any)
If a scalar is annotated with a type and a mismatched value is assigned to it, a runtime error occurs.
Arrays
An array is a list of values. Arrays are named and referenced with a leading at sign (@). Array elements are indexed with integers starting at 0 surrounded by square brackets ([,]).
my @set = 'a','b','c'; @set[0] = 'd'; say @set; # [d b c]
Arrays can be declared with a fixed size.
my @set[3];
If an out-of-range index is assigned to, a runtime error occurs.
Arrays can also be declared as multi-dimensional.
my @table[3;2];
Arrays are typed according to the elements.
my Int @set = 1,2,3;
Hashes
A hash is a mapping of keys to values. Hashes are named and referenced with a leading percent sign (%). Hashes are index by keys surrounded by angled brackets (<,>).
These are equivalent declarations:
my %map = '1','001','2','002'; my %map = 1 => '001', 2 => '002'; say %map<1>; # 001
An empty hash can be declared in two ways:
my %map = {}; my %map = %();
Hashes are typed according to the values, not the keys.
my Int %map = '1',1,'2',2;
To constrain the type of keys as well, try:
my Int %map{Str} = '1',1,'2',2;