gpt4 book ai didi

raku - 一个 perl6 模块可以有条件地 'use' 另一个 perl6 模块吗?

转载 作者:行者123 更新时间:2023-12-04 19:26:41 25 4
gpt4 key购买 nike

有没有一种明智的方法可以让一个 perl6 模块检查另一个 perl6 模块的存在,并且当且仅当它安装时才“使用”它?

像这样的东西...

module Polygons;

if $available {
use Measure; #only if Measure is installed
}

class Rectangle is export {
has $.width;
has $.height;

method area {
$!width * $!height; #provides operator overload for Measure * Measure
}
}
#====================

module Measure;

class Measure is export {
has $.value;
has $.unit;

method Real {
$!value;
}
method Str {
"$!value $!unit";
}
method multiply( $argument ) {
my $result = $.;
$result.value = $!value * $argument;
$result.unit = "$!unit2";
return $result;
}
}

multi infix:<*> ( Measure:D $left, Measure:D $right ) is export {
return $result.multiply( $argument );
}

#====================

#main.p6

use Polygons;
use Measure;

my $x = Measure.new( value => 10, unit => 'm' );
my $y = Measure.new( value => 20, unit => 'm' );

my $rect = Rectangle.new( width => $x, height => y );
say $rect.area; #'200 m2'

这个想法是传播运算符重载(在这种情况下为中缀:<*>)备份类继承,以便在属性中存储更精细的对象。

(请不要撕裂下水道——因为我怀疑总有办法!)

最佳答案

所以这个答案的第一个版本基本上没有用。

这是我想出的第一个新东西,它适用于我理解你的问题。我还没有在 repo 上尝试过。

在文件中 a-module.pm6 :

unit module a-module;
our sub infix:<*> ($l,$r) { $l + $r } }
our意味着我们可以看到这个例程 require它,虽然它只能通过它的完全限定名 &a-module::infix:<*> 可见.

然后在使用文件中:
use lib '.';
try require a-module;
my &infix:<*> = &a-module::infix:<*> // &OUTER::infix:<*>;
say 1 * 2 # 2 or 3 depending on whether `a-module.pm6` is found

如果缺少模块,则使用的默认例程可以是 OUTER 中的例程。 (如图所示)或来自 CALLER或任何其他 pseudo package你比较喜欢。

这个问题/解决方案似乎很基本,我怀疑它必须在 SO 上或某个文档中。我将发布我所拥有的内容,然后在明天进行更多探索。

关于raku - 一个 perl6 模块可以有条件地 'use' 另一个 perl6 模块吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54064251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com