可以动态创建 class 别名吗?

Possible to create class aliases dynamically?

知道了class:

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

我创建了这样的别名:

class Mass-lbs is Mass-lb { }
class Mass-pound is Mass-lb { }
class Mass-pounds is Mass-lb { }
class Mass-pnds is Mass-lb { }

但我更愿意这样做:

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

这会引发错误:

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

我找不到类似乐曲的内容。

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

到那时,你使用EVAL的方法是有效的,你只需要让它更简单一点:

class Mass-lb { }
BEGIN "constant Mass-$_ = Mass-lb".EVAL
  for <lbs pounds pound pnds>;
my $mlb = Mass-lbs.new;
  1. 确保在 BEGIN 时间创建了别名。
  2. 不需要 subclass,你可以使用 constant 作为别名。
  3. 由于 constant 默认为 our,因此它们在 EVAL.
  4. 之外可见