enum 类型在 Raku 中比在其他一些语言中要复杂得多,详细信息可以在 其类型描述 中找到。

本简短文档将提供一个简单的使用示例,就像在类 C 语言中通常的做法一样。

假设我们有一个程序需要写入不同的目录;我们想要一个函数,它在给定目录名称的情况下,测试它是否存在 (1) 以及 (2) 用户是否可以写入它;这意味着从用户角度来看有三种可能的状态:要么可以写入 (CanWrite),要么没有目录 (NoDir),要么目录存在,但你无法写入 (NoWrite)。测试结果将决定程序接下来采取的操作。

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