我知道这样做是不起作用的,因为我已经尝试过:
if $r ~~ BearingTrue || CompassAdj || CourseAdj { nextsame };
但是 - 是否有一种简洁明了、易读的方法来在同一行上执行多个类型智能匹配,而不必扩展到给定/when或if/else结构?
我知道这样做是不起作用的,因为我已经尝试过:
if $r ~~ BearingTrue || CompassAdj || CourseAdj { nextsame };
但是 - 是否有一种简洁明了、易读的方法来在同一行上执行多个类型智能匹配,而不必扩展到给定/when或if/else结构?
你尝试过:
if $r ~~ BearingTrue | CompassAdj | CourseAdj { nextsame };
这将为您提供一个任意交叉点,然后匹配 OK。
<...>
创建了一个 Str
的 List
。 因此,您正在与字符串进行智能匹配,而不是类型。 if $r ~~ (BearingTrue、CompassAdj、CourseAdj).any { nextsame }
应该可以正常工作。 顺便说一句,这似乎是使用 if
的语句修饰符版本的好机会:nextsame if $r ~~ (BearingTrue、CompassAdj、CourseAdj).any;
- uzluisfclass BearingTrue { ...}
class BearingMag { ...}
sub err-msg { die "Can't mix BearingTrue and BearingMag for add/subtract!" }
class BearingTrue is Bearing is export {
multi method compass { <T> } #get compass
multi method compass( Str $_ ) { #set compass
die "BearingTrue compass must be <T>" unless $_ eq <T> }
method M { #coerce to BearingMag
my $nv = $.value + ( +$variation + +$deviation );
BearingMag.new( value => $nv, compass => <M> )
}
#| can't mix unless BearingMag
multi method add( BearingMag ) { err-msg }
multi method subtract( BearingMag ) { err-msg }
}
zef install https://github.com/p6steve/raku-Physics-Navigation.git
接着参考bin/synopsis-navigation.raku顶部的示例使用该模块,并在自己的代码中使用各种类。
如果你只是想看看这些组件是如何配合的,我建议按照相似的思路编写自己的简单类,并通过书籍(如ThinkRaku第12章)中的示例进行学习。我推荐这个学习方法,因为它提供了清晰的信息和等同对待继承和角色。
我相信其他人会认为我的代码风格过于依赖继承。我认为,由于磁轴承严格来说是从一般轴承导出的概念,所以这对我的代码来说是正确的--但是角色和组合不太受限制,并提供了更好的可维护性的封装。