得到了这门课:
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 的类似内容。
在 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)
BEGIN。constant来别名。constants 是our默认的,因此它们在EVAL.