一个perl6模块可以有条件地“使用”另一个perl6模块吗?
发布时间:2020-12-15 21:44:45 所属栏目:大数据 来源:网络整理
导读:是否有一种合理的方法让一个perl6模块检查是否存在另一个perl6模块,并且当且仅当它被安装时才“使用”它? 像这样…… module Polygons;if $available { use Measure; #only if Measure is installed}class Rectangle is export { has $.width; has $.height
是否有一种合理的方法让一个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' 我们的想法是传播运算符重载(在这种情况下为infix:< *>)备份类继承,以便在属性中存储更复杂的对象. (请不要撕毁排水沟 – 因为我怀疑总有办法!) 解决方法
所以这个答案的第一个版本基本没用.
这是我提出的第一个与我理解你的问题有关的新东西.我还没试过回购. 在文件a-module.pm6中: unit module a-module; our sub infix:<*> ($l,$r) { $l + $r } } 我们的意思是,如果我们可以要求它,我们将能够看到这个例程,尽管它只能通过其完全限定的名称和& 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或某个地方的文档中.我将发布我的内容,然后明天再探讨. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |