可以动态创建类别名吗?

Ste*_*ieD 6 raku

得到了这门课:

class Mass-lb is Mass {
    method new(Rat:D() $value = 1.0) {
        self.bless(
            :abbr('lb'),
            :base_value(453.59237),
            :$value,
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我创建了这样的别名:

class Mass-lbs is Mass-lb { }
class Mass-pound is Mass-lb { }
class Mass-pounds is Mass-lb { }
class Mass-pnds is Mass-lb { }
Run Code Online (Sandbox Code Playgroud)

但我更喜欢做这样的事情:

my @lb-syn = < lbs pounds pound pnds >;
for @lb-syn {
    EVAL 'class ::("Mass-$_") is Mass-lb {}';
}
Run Code Online (Sandbox Code Playgroud)

这会引发错误:

Name ::("Mass-$_") is not compile-time known, and can not serve as a package name

PHP 有一个内置的用于创建别名的工具:https://www.php.net/manual/en/function.class-alias.php

我找不到 raku 的类似内容。

Eli*_*sen 9

在 RakuAST 中,您可以调用一个类来创建新类型。但RakuAST分支还没有落地。

在那之前,您使用的方法EVAL是有效的,您只需使其变得简单一点:

class Mass-lb { }
BEGIN "constant Mass-$_ = Mass-lb".EVAL
  for <lbs pounds pound pnds>;
my $mlb = Mass-lbs.new;
Run Code Online (Sandbox Code Playgroud)
  1. 确保及时创建别名BEGIN
  2. 无需子类化,您可以使用 aconstant来别名。
  3. 由于constants 是our默认的,因此它们在EVAL.