Enumeration
The enum
type is much more complex in Raku than in some other languages,
and the details are found in its type description.
This short document will give a simple example of its use as is the usual practice in C-like languages.
Say we have a program that needs to write to various directories; we want a
function that, given a directory name, tests it for (1) its existence and (2)
whether it can be written to by the user of the program; this implies that there
are three possible states from the user perspective: either you can write
(CanWrite
), or there is no directory (NoDir
) or the directory exists, but
you cannot write (NoWrite
). The results of the test will determine what
actions the program takes next.
enum DirStat <CanWrite NoDir NoWrite>;
sub check-dir-status($dir --> DirStat) {
if $dir.IO.d {
# dir exists, can the program user write to it?
my $f = "$dir/.tmp";
spurt $f, "some text";
CATCH {
# unable to write for some reason
return NoWrite;
}
# if we get here we must have successfully written to the dir
unlink $f;
return CanWrite;
}
# if we get here the dir must not exist
return NoDir;
}
# test each of three directories by a non-root user
my @dirs = (
'/tmp', # normally writable by any user
'/', # writable only by root
'~/tmp' # a non-existent dir in the user's home dir
);
for @dirs -> $dir {
my $stat = check-dir-status $dir;
say "status of dir '$dir': $stat";
if $stat ~~ CanWrite {
say " user can write to dir: $dir";
}
}
# output
# status of dir '/tmp': CanWrite
# user can write to dir: /tmp
# status of dir '/': NoWrite
# status of dir '~/tmp': NoDir