如何创建一个与 Raku 中的内置类同名的类,而又不会掩盖它?

uzl*_*xxx 8 raku

这很愚蠢,我知道显而易见的事情就是简单地以不同的方式命名该类,但我仍然很好奇。在类中ColumnType::Date,我想typecast返回一个 Raku 的Date对象,而不是一个ColumnType::Date

module ColumnType {
    class Date {
        method typecast(Blob:D $value) {
            my $date = $value.decode('ascii').trim;
            my ($year, $month, $day) = $date.split('/');
            return try Date.new: :$year, :$month, :$day;
        }
    }
}

my $blob = "1980/01/01".encode('ascii');
say ColumnType::Date.new.typecast($blob);
Run Code Online (Sandbox Code Playgroud)

换句话说,是否可以将 Raku's 引用Date为完全限定的名称?

Eli*_*sen 10

是的。通过前缀CORE::.

$ raku -e 'say CORE::Date =:= Date'
True
Run Code Online (Sandbox Code Playgroud)

编辑:

更一般地,您可以通过使用 来访问在词法上覆盖后在词法上可用的内容my constant。在您的示例中,您还可以这样做:

module ColumnType {
    my constant OriginalDate = Date;
    class Date {
        method typecast(Blob:D $value) {
            my $date = $value.decode('ascii').trim;
            my ($year, $month, $day) = $date.split('/');
            return try OriginalDate.new: :$year, :$month, :$day;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Date这会将模块内类的可见性“保存”为OriginalDate,然后您可以使用它来调用.new

  • @librasteve“那么常量会像`:=`那样绑定吗?” 啊,含糊不清。从你大概的意思来看,莉兹直觉地认为,是的:“constant foo = bar”和“constant foo := bar”的意思完全相同。但对于可能有不同想法的读者来说,与 `:=` 与 `my` 变量一起工作的方式不同,`constant` 是一次性的——你不能写 `foo := baz` 来改变绑定 - 并且绑定是在*编译时*而不是*运行时*完成的。 (2认同)